2016-10-25 18 views
1

米国財務省のウェブサイトhereで提供されているXMLをLINQのXDocumentを使用して解析しようとしていますが、プログラムによって名前空間を解析しようとしています。ここでXDocumentで名前空間で属性を解析する

XDocument doc = XDocument.Load("http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=year(NEW_DATE)%20eq%202016"); 

そのXMLの機能縮小版である:彼らはしているような値に*の要素:*とD:Iハードコードの名前空間がmにアクセスするために、場合

<?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> 

XNamespace ns = "http://www.w3.org/2005/Atom"; 
XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"; 
XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 

その後、私は

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 

私はdmを調べる場合、それは結局のところそれらは名前空間http://www.w3.org/2000/xmlns/を使用します。これはデフォルトでなければなりません。要素のようにxmlns属性に定義されている名前空間を使用しないのはなぜですか?属性の順序は重要ですか?あるいは、xmlns名前空間は、明示的に使用されたときに単に上書きすることはできませんか?

+0

'xmlns'接頭辞は' http:// www.w3.org/2000/ xmlns/'名前空間で固定されており、上書きすることはできません。 – PetSerAl

+0

私はちょうど 'xmlns =" http://www.w3.org/2005/Atom "で現地版を試しましたが、それはまだ同じ問題があったので、注文はしませんでした問題。限り、私はxmlnsをハードコーディングして燃えていない限り、私はうまくいくはずです。ちょっと変わって、要素の名前空間は変更されますが、名前空間タグ自体は変更されないようです - 私はこれを少し間違った角度から見ているように感じます。 – Danny

+0

私は、名前空間をハードコーディングする方が接頭語をハードコーディングする方がはるかに望ましいと考えていました。接頭辞は変更することができ、XMLは意味的に同じです。これは名前空間の変更よりもはるかに可能性が高いです。 –

答えて

1

属性名は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; 
+0

これは私がやったことです。ありがとう。 XNamespace.Xmlns'プロパティを見た後では特に気分が良くなります。なぜなら、後で引き出したラグをあまり使わないように感じるからです。 – Danny

関連する問題