使用XDocument和XPath解析xml

4 .net c# xml linq-to-xml

<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");
Run Code Online (Sandbox Code Playgroud)

以上是我从第三方来源消费的xml.出于某种原因,我不能用上面描述的任何一种方法解析xml.任何见解都会非常有用,非常感谢你

Igo*_*aka 9

这一点

var affidavits = xDocument.Descendants("AFFIDAVIT");
Run Code Online (Sandbox Code Playgroud)

不起作用,因为AFFIDAVIT它在http://pria.org命名空间中.这应该工作(虽然没有测试过):

var affidavits = xDocument.Descendants("{http://pria.org}AFFIDAVIT");
Run Code Online (Sandbox Code Playgroud)

替代方案,无需在代码中对命名空间进行硬编码就是使用根节点的命名空间,如下所示:

var affidavits = xDocument.Descendants(xDocument.Root.Name.Namespace + "AFFIDAVIT");
Run Code Online (Sandbox Code Playgroud)

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

var affidavitsTest = xDocument.XPathEvaluate("/REETA/AFFIDAVIT/COUNTY_NAME");
Run Code Online (Sandbox Code Playgroud)

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


chr*_*ssr 8

您没有指定命名空间.尝试:

XNamespace ns = "http://pria.org";
var affidavits = xDocument.Descendants(ns + "AFFIDAVIT");
Run Code Online (Sandbox Code Playgroud)

  • @Kugel - 实际上MSDN上的建议是使用字符串连接,因为为此目的重写了运算符:"对于C#,在命名空间中创建XName的推荐方法是声明XNamespace对象,然后使用覆盖加法运算符." 在"在命名空间中创建XName"部分中找到:http://msdn.microsoft.com/en-us/library/system.xml.linq.xname (3认同)
  • 我会使用ns.GetName()而不是字符串连接 (2认同)