C# 使用XDocument解析具有名称空间的属性

C# 使用XDocument解析具有名称空间的属性,c#,xml,C#,Xml,我试图使用LINQ的XDocument解析美国财政部在其网站上提供的XML,但在尝试以编程方式解析名称空间时遇到了问题 XDocument doc = XDocument.Load("http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=year(NEW_DATE)%20eq%202016"); 以下是他们的XML的精简版本: <?xml version="1.0" encoding="utf-

我试图使用LINQ的
XDocument
解析美国财政部在其网站上提供的XML,但在尝试以编程方式解析名称空间时遇到了问题

XDocument doc = XDocument.Load("http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=year(NEW_DATE)%20eq%202016");
以下是他们的XML的精简版本:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://data.treasury.gov/Feed.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <entry>
    <content type="application/xml">
      <m:properties>
        <d:NEW_DATE m:type="Edm.DateTime">2016-01-04T00:00:00</d:NEW_DATE>
        <d:BC_1YEAR m:type="Edm.Double">0.61</d:BC_1YEAR>
      </m:properties>
    </content>
  </entry>
</feed>
然后我可以用

Convert.ToDateTime(doc.Root.Element(ns + "entry").Element(ns + "content").Element(m + "properties").Element(d + "NEW_DATE"));
而且效果很好。但是我不想硬编码名称空间,所以我尝试使用类似的方法将它们从根中拉出,但我得到了
null
值:

XNamespace ns = doc.Root.Attribute("xmlns").Value;   // gives "http://www.w3.org/2005/Atom"
XNamespace m = doc.Root.Attribute(ns + "m").Value;   <--- ERROR because the attribute is null
XNamespace d = doc.Root.Attribute(ns + "d").Value;   <--- ERROR because the attribute is null
XNamespace ns=doc.Root.Attribute(“xmlns”).Value;//给予”http://www.w3.org/2005/Atom"

xm=doc.Root.Attribute(ns+“m”).Value 属性的名称是
xmlns:d
<代码>xmlns
由XML名称空间标准保留。xml标准保留以
xml
xml
开头的任何属性或元素。属性
xmlns
指定元素或文档的默认名称空间

 XNamespace d = doc.Root.Attribute(XNamespace.Xmlns+"d").Value;
 XNamespace m = doc.Root.Attribute(XNamespace.Xmlns+"m").Value;

xmlns
前缀对于
http://www.w3.org/2000/xmlns/
namespace,无法重写。可能是这样的-我刚刚用
xmlns=”尝试了一个本地版本http://www.w3.org/2005/Atom“
首先出现,但仍然存在相同的问题,因此顺序无关紧要。只要我没有被硬编码xmlns所累,那么我就应该没事了。对我来说似乎有点奇怪,它改变了元素的名称空间,而不是名称空间标记本身——我觉得我从一个稍微错误的角度来看这个问题。我认为硬编码名称空间比硬编码前缀要好得多。前缀可以更改,XML在语义上是相同的——这比名称空间更改的可能性要大得多。谢谢在看到
XNamespace.Xmlns
属性后,我感觉特别好,因为它让我感觉不太像以后会把地毯拔出来。
 XNamespace d = doc.Root.Attribute(XNamespace.Xmlns+"d").Value;
 XNamespace m = doc.Root.Attribute(XNamespace.Xmlns+"m").Value;