在Linq-to-XML中如何通过路径查找XML节点

8
如果我以字符串形式获得特定节点的路径,是否可以使用Linq / XElement(或XDocument)的方法轻松找到该节点。
由于XML对象有很多不同类型,如果您能额外提供指向使用不同类型的原因/方法的指南,那将是很好的。
编辑:好的,在被指向XPathSelectElement之后,我正在尝试它,以便我可以给他正确的答案,但我无法使其正常工作。 这是我正在尝试的XML。
<Product>
  <Name>SomeName</Name>
  <Type>SomeType</Type>
  <Quantity>Alot</Quantity>
</Product>

以及我的代码

string path = "Product/Name";
string name = xml.XPathSelectElement(path).Value;

注意,我的字符串来自其他地方,所以我想它不必是字面值(至少在调试模式下它看起来像上面那个)。我还尝试在前面添加 / ,但会导致空引用错误。
2个回答

13

尝试使用XElementXPathSelectElement扩展方法。您可以传递一个XPath表达式给该方法进行评估。例如:

XElement myElement = rootElement.XPathSelectElement("//Book[@ISBN='22542']");

编辑:

回复您的编辑,检查您的XPath表达式。如果您的文档只包含该小片段,则/Product/Name将作为前导斜杠从文档根执行搜索:

XElement element = document.XPathSelectElement("/Product/Name");

如果存在其他产品,且 <Product> 不是根节点,则需要修改您正在使用的 XPath。


我无法让它识别XPathSlectElement,直到我手动添加了Using语句。然而它并没有像我希望的那样工作。你能告诉我哪里有问题吗(请参见上面的编辑),这样我就可以给你接受的答案? - Ingó Vals
变量名为xml的部分只是我提到的那一部分,它是更大的XML树的一部分,并作为参数传递。如果在调试模式下检查xml变量,它会显示上面的产品XML。我还尝试将原始Xpath放入其中,但也不起作用。 - Ingó Vals
5
顺便提一下,所需的 "using" 是 System.Xml.XPath。 - grantnz

6

你也可以使用XPathEvaluate

XDocument document = XDocument.Load("temp.xml");
var found = document.XPathEvaluate("/documents/items/item") as IEnumerable<object>;
foreach (var obj in found)
{
    Console.Out.WriteLine(obj);    
}

给定以下 XML:

<?xml version="1.0" encoding="utf-8" ?>
<documents>
  <items>
    <item name="Jamie"></item>
    <item name="John"></item>
  </items>
</documents>

这应该打印出items节点中的内容。

当你有很多同名的时候,这可能会很有用,谢谢。 - Ingó Vals

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接