2008-09-14 238 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> 

我寧願沒有的xmlns = 「」 的URL元素。我可以在最終的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 2008-09-14 05:22:32

2

如果一個元素使用一個名稱空間,他們都必須使用一個。如果你沒有自己定義一個框架,你會注意到框架會添加一個空的名稱空間。而且,可悲的是,沒有開關或類似的東西來壓制這個「特徵」。

因此,似乎沒有更好的方法去除它。使用替換(「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非常酷。