使用XDocument和XPath解析XML

4
<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。如有任何见解,请非常感谢您的帮助。

1
我尝试了chrissr和Igor zevaka的建议。Igor和chrissr指出我需要包含命名空间。在包含命名空间后,我无法解析xml。发生的情况是xdocument.descenants("{http://pria.org}AFFIDAVIT");返回整个xml,而xpathevaluate返回枚举未产生。 - george9170
它起作用了,谢谢。我在ns中输入的url不正确。感谢chrissr和igor。 - george9170
2个回答

9

This bit

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中指定命名空间。


8

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

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

2
我会使用ns.GetName()而不是字符串拼接。 - Kugel
3
@Kugel - MSDN建议使用字符串拼接来创建XName,因为运算符已被重载以实现这一目的:“对于C#,在命名空间中创建XName的推荐方法是声明XNamespace对象,然后使用加法运算符的重载。” 可在“Creating an XName in a Namespace”部分找到:http://msdn.microsoft.com/en-us/library/system.xml.linq.xname - Kevin Brock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接