首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPathSelectElements总是返回必须计算为节点集的表达式。

XPathSelectElements总是返回必须计算为节点集的表达式。
EN

Stack Overflow用户
提问于 2014-04-03 19:34:24
回答 2查看 1.6K关注 0票数 0

我刚开始使用LINQ,并试图从我转换过的XML文档中选择一个节点。

以下是原始代码:

代码语言:javascript
复制
// 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调试器中将其回滚到绝对的基础上:

代码语言:javascript
复制
xdoc.Root.XPathSelectElements(".")
xdoc.Root.XPathSelectElements("//DocRouteDetail")
etc

在所有情况下,它返回back null,并生成一个返回“表达式必须计算为节点集”的异常。

这发生在.NET Framework4.0中的c#中。

我已经检查过了,并且xdoc.Root变量不是null,我的xml看起来类似于以下内容(出于安全原因,整个文档压缩了):

代码语言:javascript
复制
<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元素。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 20:12:16

这不是XPathSelectElements的错,您的XPath查询是无效的--即与|操作符有关的部分。您提到的其他基本查询都是do工作的。如果它们真的没有,那么在您发布的代码之外还有其他一些错误。

我会写成

代码语言:javascript
复制
//DocRouteDetail[1]/parent::*/child::*[name()!='DocRouteDetail']

这样它就能选择你需要的东西。

票数 1
EN

Stack Overflow用户

发布于 2014-04-04 03:04:24

正如@pjotr所指出的,您的XPath尝试无效。您可以尝试使用联合运算符( XPaths ) (|)来组合如下所示的2个|

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22847270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档