C# 使用XDocument解析具有名称空间的属性
我试图使用LINQ的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-
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;