2008-09-14 17 views
32

LinqからXmlを使ってサイトマップを作成しようとしていますが、空の名前空間属性を取得しようとしています。例えばLinq Xmlを使った空の名前空間

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; 

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), 
    new XElement(ns + "urlset", 

    new XElement("url", 
     new XElement("loc", "http://www.example.com/page"), 
     new XElement("lastmod", "2008-09-14")))); 

結果は...

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url xmlns=""> 
    <loc>http://www.example.com/page</loc> 
    <lastmod>2008-09-14</lastmod> 
    </url> 
</urlset> 

は、私はむしろurl要素上のxmlnsを= "" 持っていません。私はそれを最後のxdoc.ToString()のReplaceを使って取り除くことができますが、もっと正しい方法がありますか?

答えて

43

「より正しい方法は、」次のようになります。

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "true"), 
new XElement(ns + "urlset", 
new XElement(ns + "url", 
    new XElement(ns + "loc", "http://www.example.com/page"), 
    new XElement(ns + "lastmod", "2008-09-14")))); 

あなたのコードと同じですが、サイトマップの名前空間にする必要があるすべての要素名の前に「NS +」と。これは、結果のXMLに不要な名前空間宣言を入れないように十分にスマートですので、結果は次のとおりです。私は間違っていない場合、ある

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url> 
    <loc>http://www.example.com/page</loc> 
    <lastmod>2008-09-14</lastmod> 
    </url> 
</urlset> 

、あなたが欲しいもの。

+0

非常に良い。ありがとう。 – peterorum

2

1つの要素が名前空間を使用する場合、それらはすべて1つを使用する必要があります。あなた自身で定義しない場合、フレームワークはあなたが気づいたように空の名前空間を追加します。そして、残念ながら、この "機能"を抑制するためのスイッチや類似のものはありません。

だから、それを取り除くより良い方法はないようです。 を使用する( "xmlns = \" \ ""、 "")はRegExを実行するよりも少し速くなる可能性があります。

4

VB.NETで同様の問題に対処しながらこのポストを見つけました。私はXMLリテラルを使用していましたが、このソリューションをXMLリテラル構築で機能させる方法を理解するためにいくつかの検索が必要でした。

解決方法は、ファイルの先頭にXML名前空間をインポートすることです。

Imports <xmlns:ns="x-schema:tsSchema.xml"> 

次に、クエリ式のすべてのXMLリテラルにインポートされた名前空間をプレフィックスとして付けます。これにより、出力を保存したときに要素に表示されていた空の名前空間が削除されます。

Dim output As XDocument = <?xml version="1.0" encoding="utf-8"?> 
           <XML ID="Microsoft Search Thesaurus"> 
            <thesaurus xmlns="x-schema:tsSchema.xml"> 
             <diacritics_sensitive>0</diacritics_sensitive> 
             <%= From tg In termGroups _ 
              Select <ns:expansion> 
                <%= From t In tg _ 
                 Select <ns:sub><%= t %></ns:sub> %> 
               </ns:expansion> %> 
            </thesaurus> 
           </XML> 

    output.Save("C:\thesaurus.xml") 

私はこれが誰かを助けることを望みます。このような道のりにもかかわらず、XLinq APIはかなりクールです。