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

Ing*_*als 7 c# xml xpath linq-to-xml

如果我得到一个特定节点的路径作为字符串,我可以通过使用XElement(或XDocument)的Linq /方法以某种方式轻松找到所述节点.

有很多不同类型的XML对象,如果作为一个额外的奖励,你可以指出我为什么/如何使用不同类型的指南.

编辑:确定在指向XPathSelectElement后我正在尝试它,所以我可以给他正确的答案我不能让它工作但是.这是我正在尝试的XML

<Product>
  <Name>SomeName</Name>
  <Type>SomeType</Type>
  <Quantity>Alot</Quantity>
</Product>
Run Code Online (Sandbox Code Playgroud)

和我的代码

string path = "Product/Name";
string name = xml.XPathSelectElement(path).Value;
Run Code Online (Sandbox Code Playgroud)

请注意我的字符串来自其他地方,所以我猜它不一定是文字(至少在调试模式下它看起来像上面那个).我也尝试过添加/在前面.它给了我一个空参考.

Mat*_*t B 12

尝试使用XPathSelectElement扩展方法XElement.您可以将方法传递给XPath表达式进行求值.例如:

XElement myElement = rootElement.XPathSelectElement("//Book[@ISBN='22542']");
Run Code Online (Sandbox Code Playgroud)

编辑:

在回复您的编辑时,请检查您的XPath表达式.如果您的文档仅包含该小片段,那么/Product/Name当前导斜杠从文档的根目录执行搜索时,它将起作用:

XElement element = document.XPathSelectElement("/Product/Name");
Run Code Online (Sandbox Code Playgroud)

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

  • 顺便说一句,所需的"使用"是System.Xml.XPath; (5认同)

小智 7

您还可以使用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);    
}
Run Code Online (Sandbox Code Playgroud)

给出以下xml:

<?xml version="1.0" encoding="utf-8" ?>
<documents>
  <items>
    <item name="Jamie"></item>
    <item name="John"></item>
  </items>
</documents>
Run Code Online (Sandbox Code Playgroud)

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