2008-09-14 196 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非常酷。