我有一个具有以下格式的xml文件

<someXML>
    <a>
        <b></b>
        <b test='someValue'></b>
    </a>

    <c>
        <d test='someOtherValue'></d>
        <d></d>
    </c>
</someXML>


我正在尝试编写C#代码,这将使我获得一个仅包含具有test属性的节点的节点集。我试图以这种方式使用XPathExpression:

XDocument document = XDocument.Load("someXML");
XPathNavigator navigator = document.CreateNavigator();
XPathExpression expression = XPathExpression.Compile("//*[@test]");
object nodeSet = navigator.Evaluate(expression);


这似乎不起作用。当我调试时,nodeSet始终包含Root元素。表达式有问题吗?还是可以正常工作?

谢谢!

最佳答案

您是否认为nodeSet包含“ Root”元素是因为调试器将其字符串表示形式显示为Position=0, Current={Root}?这可能会产生误导;之所以出现“根”元素,是因为XPathNodeIterator(在您的情况下为Evaluate返回的实际类型)尚未定位在查询产生的第一个节点上。根据XPathNodeIterator的MSDN文档:


  
    XPathNodeIterator类返回的XPathNavigator对象未放置在所选节点集中的第一个节点上。必须调用MoveNext类的XPathNodeIterator方法,以将XPathNodeIterator对象放置在所选节点集中的第一个节点上。
  


您可以通过遍历nodeSet来检索路径项:

XDocument document = XDocument.Load("someXML");
XPathNavigator navigator = document.CreateNavigator();
XPathExpression expression = XPathExpression.Compile("//*[@test]");
XPathNodeIterator nodeSet = (XPathNodeIterator)navigator.Evaluate(expression);
foreach (XPathItem item in nodeSet)
{
    // Process item here
}


或者,如果您希望将它们转换为数组:

XDocument document = XDocument.Load("someXML");
XPathNavigator navigator = document.CreateNavigator();
XPathExpression expression = XPathExpression.Compile("//*[@test]");
XPathNodeIterator nodeSet = (XPathNodeIterator)navigator.Evaluate(expression);
XPathItem[] items = nodeSet.Cast<XPathItem>().ToArray();

关于c# - XPath表达式,用于查找没有特定属性的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9282944/

10-09 15:55