【问题标题】:How do I find a XML node by path in Linq-to-XML如何在 Linq-to-XML 中按路径查找 XML 节点
【发布时间】:2010-08-11 13:07:41
【问题描述】:

如果我将特定节点的路径作为字符串获取,我可以通过使用 XElement(或 XDocument)的 Linq/Method 以某种方式轻松找到所述节点。

有很多不同类型的 XML 对象,如果作为额外的奖励,您可以向我指出为什么/如何使用不同类型的指南,那也很好。

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

<Product>
  <Name>SomeName</Name>
  <Type>SomeType</Type>
  <Quantity>Alot</Quantity>
</Product>

还有我的代码

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

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

【问题讨论】:

    标签: c# xml xpath linq-to-xml


    【解决方案1】:

    尝试使用XElement 的XPathSelectElement 扩展方法。您可以将 XPath 表达式传递给该方法以进行评估。例如:

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

    编辑:

    在回复您的编辑时,请检查您的 XPath 表达式。如果您的文档只包含那个小 sn-p,那么 /Product/Name 将作为前导斜杠从文档的根目录执行搜索:

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

    如果有其他产品并且&lt;Product&gt; 不是根节点,则需要修改正在使用的 XPath。

    【讨论】:

    • 在我手动添加 Using 语句之前,我无法让它识别 XPathSlectElement。但是它没有像我希望的那样工作。你能告诉我出了什么问题(见上面的编辑),所以我可以给你接受的答案吗?
    • 名为 xml 的变量只是我提到的那部分,但它是更大的 XML 树的一部分,这部分作为参数传入。如果我在调试模式下检查 xml 变量,它会显示上面的产品 XML。我也试过把原来的 Xpath 放进去,它也不起作用。
    • 顺便说一句,所需的“使用”是 System.Xml.XPath;
    【解决方案2】:

    你也可以使用 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 节点的内容。

    【讨论】:

    • 当您有很多同名时,这可能会派上用场,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多