我刚开始使用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 + "']");注意:代码settings.ShredNode的前面设置为"DocRouteDetail“
起初,我认为这与我所使用的xpath语句的复杂性有关,但是我已经尝试了我能想到的每一个组合,甚至在VS调试器中将其回滚到绝对的基础上:
xdoc.Root.XPathSelectElements(".")
xdoc.Root.XPathSelectElements("//DocRouteDetail")
etc在所有情况下,它返回back null,并生成一个返回“表达式必须计算为节点集”的异常。
这发生在.NET Framework4.0中的c#中。
我已经检查过了,并且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元素。
发布于 2014-04-03 20:12:16
这不是XPathSelectElements的错,您的XPath查询是无效的--即与|操作符有关的部分。您提到的其他基本查询都是do工作的。如果它们真的没有,那么在您发布的代码之外还有其他一些错误。
我会写成
//DocRouteDetail[1]/parent::*/child::*[name()!='DocRouteDetail']这样它就能选择你需要的东西。
发布于 2014-04-04 03:04:24
正如@pjotr所指出的,您的XPath尝试无效。您可以尝试使用联合运算符( XPaths ) (|)来组合如下所示的2个|:
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);https://stackoverflow.com/questions/22847270
复制相似问题