【问题标题】:Parsing xml with XDocument and XPath使用 XDocument 和 XPath 解析 xml
【发布时间】:2010-02-22 22:26:16
【问题描述】:
<REETA xmlns="http://pria.org">
      <AFFIDAVIT>
      <COUNTY_NAME>BOBBIES COUNTY</COUNTY_NAME> 
      <DOC_TYPE>DEED</DOC_TYPE> 
      <DOC_DATE>2010-02-19T05:14:58</DOC_DATE> 
      <GROSS_SELL_PRICE>200000.00</GROSS_SELL_PRICE> 
      <TAXABLE_SELL_PRICE>200000.00</TAXABLE_SELL_PRICE> 
      <EXCISE_TAX_STATE>2560.00</EXCISE_TAX_STATE> 
      <EXCISE_TAX_LOCAL>500.00</EXCISE_TAX_LOCAL> 
      <DELQ_INT_STATE>0.00</DELQ_INT_STATE> 
      <DELQ_INT_LOCAL>0.00</DELQ_INT_LOCAL> 
      <DELQ_PENALTY>0.00</DELQ_PENALTY> 
      <SUB_TOTAL>3060</SUB_TOTAL> 
      <STATE_TECH_FEE>5.00</STATE_TECH_FEE> 
      <PROCESSING_FEE>0.00</PROCESSING_FEE> 
      <TOTAL_DUE>3065</TOTAL_DUE> 
    - <INDIVIDUAL type="Buyer">
      <NAME>JANE DOE</NAME> 
      </INDIVIDUAL>
    - <INDIVIDUAL type="Seller">
      <NAME>JON DOE</NAME> 
      </INDIVIDUAL>
    - <PARCEL>
      <NUMBER>3141614</NUMBER> 
      </PARCEL>
      </AFFIDAVIT>
</REETA>


var affidavits = xDocument.Descendants("AFFIDAVIT");
var affidavitsTest = xDocument.XPathEvaluate("/reeta/AFFIDAVIT/COUNTY_NAME");

以上是我从第三方来源使用的 xml。出于某种原因,我无法使用上面描述的任何一种方法解析 xml。任何见解都会非常有帮助,非常感谢您

【问题讨论】:

  • 我已经尝试过 chrissr 建议和 Igor zevaka 建议。 Igor 和 chrissr 指出我需要包含命名空间。包含命名空间后,我无法解析 xml。会发生什么 xdocument.descenants("{pria.org}AFFIDAVIT");返回整个 xml,并且 xpathevaluate 返回枚举 not yeilded
  • 成功了,谢谢。我在ns里输入的url不正确。感谢 chrissr 和 igor

标签: c# .net xml linq-to-xml


【解决方案1】:

这一点

var affidavits = xDocument.Descendants("AFFIDAVIT");

不起作用,因为 AFFIDAVIThttp://pria.org 命名空间中。这应该可以工作(虽然还没有测试过):

var affidavits = xDocument.Descendants("{http://pria.org}AFFIDAVIT");

除此之外,无需在代码中硬编码命名空间的替代方法是使用根节点的命名空间,如下所示:

var affidavits = xDocument.Descendants(xDocument.Root.Name.Namespace + "AFFIDAVIT");

由于区分大小写,xpath 不起作用。对于初学者,它应该是

var affidavitsTest = xDocument.XPathEvaluate("/REETA/AFFIDAVIT/COUNTY_NAME");

REETA,而不是reeta。一旦解决了区分大小写的问题,它也会出现命名空间问题。我不太清楚如何在 XPath 中指定命名空间。

【讨论】:

    【解决方案2】:

    您没有指定命名空间。试试:

    XNamespace ns = "http://pria.org";
    var affidavits = xDocument.Descendants(ns + "AFFIDAVIT");
    

    【讨论】:

    • 我会使用 ns.GetName() 而不是字符串连接
    • @Kugel - 实际上,MSDN 上的建议是使用字符串连接,因为为此目的覆盖了运算符:“对于 C#,在命名空间中创建 XName 的推荐方法是声明 XNamespace对象,然后使用加法运算符的覆盖。”在“在命名空间中创建 XName”部分中找到:msdn.microsoft.com/en-us/library/system.xml.linq.xname
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多