使用Linq Xml的空名称空间
时间:2020-03-05 18:52:54 来源:igfitidea点击:
我正在尝试使用Linq to 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删除它,但是还有更正确的方法吗?
解决方案
回答
如果一个元素使用名称空间,则它们都必须使用一个名称空间。万一我们没有自己定义一个,框架将添加一个空的命名空间,正如我们所注意到的那样。而且,可悲的是,没有任何开关或者类似的东西可以抑制这种"功能"。
因此,似乎没有比这更好的方法了。使用Replace(" xmlns = " "","")可能比执行RegEx快一点。
回答
"更正确的方法"将是:
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>
如果我没记错的话,那就是你想要的。
回答
我在处理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还是很酷的。