我有一个具有以下格式的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/