繁体   English   中英

XPathSelectElements始终返回Expression必须计算为节点集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM