【问题标题】:Absolute Xpath to get list of childnodes?获取子节点列表的绝对 Xpath?
【发布时间】:2010-05-05 07:33:12
【问题描述】:

在 380509 吨 20071215

对于上面的xml文件,我需要xpath来接收它下面的子节点:

我需要的输出是:

<exchange-documents xmlns="http://www.epo.org/exchange">
    <exchange-document country="AT" doc-number="380509" family-id="38826527" kind="T" system="ops.epo.org">
      <bibliographic-data>
        <publication-reference data-format="docdb">
          <document-id>
            <country>AT</country>
            <doc-number>380509</doc-number>
            <kind>T</kind>
            <date>20071215</date>
          </document-id>
        </publication-reference>  
        <parties>
          <applicants>
          </applicants>
          <inventors>
          </inventors>
        </parties>
      </bibliographic-data>
    </exchange-document>

我使用 Linq-Xml 获取以下数据:

这是我的 Xpath 和代码:

var list = doc1.XPathSelectElement("exchange-document");

我无法检索所需的输出。它为上述代码返回 null。任何人都可以通过提供正确的 xpath 来检索子节点来帮助解决这个问题。还有没有其他方法可以找回来。

【问题讨论】:

  • “/worldpatentdata/exchange-documents/exchange-document”怎么样?

标签: xml xpath


【解决方案1】:

问题在这里得到了很好的解释:Search XDocument using LINQ without knowing the namespace

你的 xml 有命名空间。当您搜索元素时,Name 属性是一个包含命名空间的 XNamae。所以你必须寻找 Name.LocalName == [theNameOfYourNode]

var xml = XElement.Parse(@"<worldpatentdata xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema"">
          <meta name=""elapsed-time"" value=""329"" xmlns=""http://ops.epo.org/\""/>
          <exchange-documents xmlns=""http://www.epo.org/exchange\"">
            <exchange-document country=""AT"" doc-number=""380509"" family-id=""38826527"" kind=""T"" system=""ops.epo.org"">
              <bibliographic-data>
                <publication-reference data-format=""docdb"">
                  <document-id>
                    <country>AT</country>
                    <doc-number>380509</doc-number>
                    <kind>T</kind>
                    <date>20071215</date>
                  </document-id>
                </publication-reference>  
                <parties>
                  <applicants>
                  </applicants>
                  <inventors>
                  </inventors>
                </parties>
              </bibliographic-data>
            </exchange-document>
          </exchange-documents>
        </worldpatentdata>");

        var a = xml.Descendants().First(x => x.Name.LocalName == "exchange-documents");
        Console.WriteLine(a);

【讨论】:

  • 太棒了! :) Xlinq 非常适合使用 XML,许多人更喜欢它而不是 XPath。
【解决方案2】:

您的 XML 文档使用 XML 命名空间,因此您需要在 XPath 表达式中指定它们。请参阅以下内容了解如何执行此操作:

【讨论】:

    【解决方案3】:

    输入要检索的 xpath 的完整路径。

    【讨论】:

    • 喜欢这个“worldpatentdata/exchange-documents/exchange-document”?仍然收到空响应
    • 你需要这样写:“/worldpatentdata/exchange-documents/exchange-document”。
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 2015-03-30
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多