我正在尝试使用Linq到Xml创建一个站点地图,但我得到一个空的命名空间属性,我想摆脱它。 e.g。
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来删除它,但是有更正确的方法吗?
答案 0 :(得分: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"))));
与您的代码相同,但在每个要在sitemap命名空间中的元素名称之前使用“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>
如果我没弄错的话,那就是你想要的。
答案 1 :(得分: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非常酷。
答案 2 :(得分:2)
如果一个元素使用命名空间,则它们都必须使用一个。如果您没有自己定义一个,框架将添加一个空命名空间,如您所注意到的那样。而且,遗憾的是,没有任何开关或类似的东西可以抑制这个“功能”。
所以,似乎没有更好的方法来剥离它。使用 Replace(“xmlns = \”\“”,“”)可能比执行RegEx快一点。