[英]XPathSelectElements always returns Expression must evaluate to a node-set
我是使用LINQ的新手,正在尝试从已转换的XML文档中选择一个节点。
这是原始代码:
// create a LINQ xml doc
XDocument xdoc = XDocument.Parse(xTransformedDoc.OuterXml);
// get sibling elements to the shredding element
IEnumerable<XElement> xe = xdoc.Root.XPathSelectElements("//" + settings.ShredNode + "[1]/(following-sibling|preceding-sibling)[name() != '" + settings.ShredNode + "']");
注意:前面的代码设置。ShredNode设置为“ DocRouteDetail”
起初我以为我正在使用的xpath语句的复杂性存在问题,但是我尝试了我能想到的每种组合,甚至将其回滚到VS调试器中的绝对基础知识:
xdoc.Root.XPathSelectElements(".")
xdoc.Root.XPathSelectElements("//DocRouteDetail")
etc
在所有情况下,它都返回null并生成异常,返回“表达式必须求值到节点集”。
这是在C#的.NET Framework 4.0中发生的。
我已经检查过,并且xdoc.Root变量不为null,并且我的xml如下所示(出于安全原因精简了整个文档):
<DocFWImport xmlns:dtfn2="urn:my-scripts2">
<Header SendDateTime="2014-04-03T19:26:50" />
<Request>
<DocRouteDetail MessagePurpose="1002" ResourceKey="A" >
<DocStop StopNumber="0" Type="0" LocationType="DEPOT">
</DocStop>
<DocStop StopNumber="1" Type="3" LocationType="CUSTOMER" >
</DocStop>
<DocStop StopNumber="2" Type="0" LocationType="DEPOT">
</DocStop>
</DocRouteDetail>
<parmRouteTemplateKey>TEAM</parmRouteTemplateKey>
<DocRouteDetail MessagePurpose="1002" ResourceKey="B" >
<DocStop StopNumber="0" Type="0" LocationType="DEPOT">
</DocStop>
<DocStop StopNumber="1" Type="3" LocationType="CUSTOMER" >
</DocStop>
<DocStop StopNumber="2" Type="0" LocationType="DEPOT">
</DocStop>
</DocRouteDetail>
<parmRouteTemplateKey>SINGLE</parmRouteTemplateKey>
etc
</Request>
</DocFWImport>
它应该已经返回了2个parmRouteTemplateKey元素。
这不是XPathSelectElements
的错,您的XPath查询无效-即带有|
的部分|
运营商。 你提到的其他基本的查询做的工作。 如果他们确实不这样做,那么在您发布的代码之外还有其他错误。
我写成
//DocRouteDetail[1]/parent::*/child::*[name()!='DocRouteDetail']
这样,它会选择您需要的东西。
如@pjotr所指出,您的XPath尝试无效。 您可以尝试使用联合运算符( |
)合并两个XPath,如下所示:
var xpath1 = "//" + settings.ShredNode
+ "[1]/following-sibling[name() != '" + settings.ShredNode + "']";
var xpath2 = "//" + settings.ShredNode
+ "[1]/preceding-sibling[name() != '" + settings.ShredNode + "']";
IEnumerable<XElement> xe =
xdoc.Root
.XPathSelectElements(xpath1 + " | " + xpath2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.