分享

c# 添加xml节点多了xmlns属性问题

 球球圆圆豆豆 2016-01-20

今天用c#程序生成百度站点地图文件sitemap.xml的时候,创建url节点多了莫名的多了xmlns属性。原来是上级节点有这个属性,而子节点也要指定,不然就会多这个。问题原因:

当父节点具有XMLNS属性时,子节点必须指定XMLNS属性,但是当子节点的XMLNS属性与父节点命名空间相同时,子节点不显示XMLNS属性,上面问题的根本所在就是我们理解上的错误,认为我没有为子节点指定命名空间,就不应该出现此属性,恰恰相反,当我们为其指定与父节点相同的命名空间时,此属性才不会出现。

原始xml文件内容


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <urlset xmlns="http://www./schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">
  3. <url>
  4. <loc>http://m./index.html</loc>
  5. <mobile:mobile type="mobile" />
  6. <lastmod>2009-12-14</lastmod>
  7. <changefreq>daily</changefreq>
  8. <priority>0.8</priority>
  9. </url>
  10. </urlset>
添加节点的c#代码



  1. public static bool AddUrl2(SitemapUrl model)
  2. {
  3. XmlDocument doc = new XmlDocument();
  4. doc.Load(@"c:\test.xml");
  5. var rootNode = doc.GetElementsByTagName("urlset");
  6. if (rootNode.Count == 1)
  7. {
  8. var loc = doc.CreateElement("loc");
  9. loc.InnerText = model.loc;
  10. var lastmod = doc.CreateElement("lastmod");
  11. lastmod.InnerText = model.lastmod;
  12. var changefreq = doc.CreateElement("changefreq");
  13. changefreq.InnerText = model.changefreq;
  14. var priority = doc.CreateElement("priority");
  15. priority.InnerText = model.priority;
  16. var url = doc.CreateElement("url");
  17. url.AppendChild(loc);
  18. url.AppendChild(lastmod);
  19. url.AppendChild(changefreq);
  20. url.AppendChild(priority);
  21. var root = rootNode[0];
  22. root.AppendChild(url);
  23. doc.Save(@"c:\test.xml");
  24. return true;
  25. }
  26. else
  27. return false;
  28. }
新加的节点



  1. <url xmlns="">
  2. <loc>http://www.baidu.com/</loc>
  3. <lastmod>2014-12-02</lastmod>
  4. <changefreq>daily</changefreq>
  5. <priority>1</priority>
  6. </url>
新节点多了一个xmlns属性,这个属性是表示命名空间的意思

原来是url的父节点urlset有这个属性,在用c#插入xml节点的时候没有传入这个参数,所以要修复这个问题,不想要这个属性就优传入就可以了。调用CreateElement一个重载方法

doc.CreateElement("url", doc.DocumentElement.NamespaceURI);

完整代码:
  1. public static bool AddUrl(SitemapUrl model)
  2. {
  3. XmlDocument doc = new XmlDocument();
  4. doc.Load(@"c:\test.xml");
  5. var rootNode = doc.GetElementsByTagName("urlset", doc.DocumentElement.NamespaceURI);
  6. if (rootNode.Count == 1)
  7. {
  8. var loc = doc.CreateElement("loc", doc.DocumentElement.NamespaceURI);
  9. loc.InnerText = model.loc;
  10. var lastmod = doc.CreateElement("lastmod", doc.DocumentElement.NamespaceURI);
  11. lastmod.InnerText = model.lastmod;
  12. var changefreq = doc.CreateElement("changefreq", doc.DocumentElement.NamespaceURI);
  13. changefreq.InnerText = model.changefreq;
  14. var priority = doc.CreateElement("priority", doc.DocumentElement.NamespaceURI);
  15. priority.InnerText = model.priority;
  16. var url = doc.CreateElement("url", doc.DocumentElement.NamespaceURI);
  17. url.AppendChild(loc);
  18. url.AppendChild(lastmod);
  19. url.AppendChild(changefreq);
  20. url.AppendChild(priority);
  21. var root = rootNode[0];
  22. root.AppendChild(url);
  23. doc.Save(@"c:\test.xml");
  24. return true;
  25. }
  26. else
  27. return false;
  28. }
注意:url的子节点(如:loc,lastmod)创建的也得传入doc.DocumentElement.NamespaceURI这个参数,不然也会多了一个xmlns=""。当然从开始就没有指定xmlns,就不用这们传入doc.DocumentElement.NamespaceURI了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多