C#处理带命名空间的XML

来源:互联网 发布:软件项目交接文档 编辑:程序博客网 时间:2024/04/29 06:02
写入带命名空间的xml文本。
  1. XmlDocument doc = new XmlDocument();
  2.             doc.LoadXml("<?xml version=/"1.0/" encoding=/"utf-8/"?><root></root>");
  3.             //namespace为空时,不能设置prefix
  4.             XmlElement ele = doc.CreateElement("bbs","hit","urn:bbs");
  5.             ele.InnerText = "100";
  6.             doc.DocumentElement.AppendChild(ele);
  7.             doc.Save("test1.xml");

空namespace的元素不能设置前缀。
保存后test1.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <bbs:hit xmlns:bbs="urn:bbs">100 </bbs:hit>
</root>

 

 

读取带命名空间的xml文本。

  1. XmlDocument doc = new XmlDocument();
  2. //报错:“bbs”是未声明的命名空间
  3.             //doc.LoadXml("<?xml version=/"1.0/" encoding=/"utf-8/"?><root><bbs:hit>99</bbs:hit></root>");
  4.             doc.LoadXml("<?xml version=/"1.0/" encoding=/"utf-8/"?><root><bbs:hit xmlns:bbs=/"urn:bbs/">100</bbs:hit></root>");
  5.             XmlNode root = doc.DocumentElement;
  6.             XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
  7.             xnm.AddNamespace("bbs""urn:bbs");
  8.             XmlNode node = root.SelectSingleNode("bbs:hit", xnm);
  9.             if(node != null)
  10.                 System.Console.WriteLine("found node :" +  node.InnerText);

 

另一个读取的例子。

  1. XmlDocument doc = new XmlDocument();
  2.             doc.LoadXml("<?xml version=/"1.0/" encoding=/"utf-8/"?><root xmlns=/"http://www.163.com/rss/0.9/"><news><title>这是标题</title></news></root>");
  3.             XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
  4.             xnm.AddNamespace("bbs""http://www.163.com/rss/0.9");
  5.             XmlNode root = doc.SelectSingleNode("bbs:root", xnm);
  6.             XmlNode news = root.SelectSingleNode("bbs:news",xnm);
  7.             //错误,取不到节点
  8.             //news = root.SelectSingleNode("news", xnm);
  9.             XmlNode title = doc.SelectSingleNode("bbs:root/bbs:news/bbs:title", xnm);
  10.             System.Console.WriteLine("root.InnerXml = " + root.InnerXml);
  11.             System.Console.WriteLine("news.InnerXml = " + news.InnerXml);
  12.             System.Console.WriteLine("title.InnerText = " + title.InnerText);
  13.             System.Console.ReadLine();

输出:

root.InnerXml = <news xmlns="http://www.163.com/rss/0.9"><title>这是标题</title>
</news>
news.InnerXml = <title xmlns="http://www.163.com/rss/0.9">这是标题</title>
title.InnerText = 这是标题

可见子节点也继承了父节点的命名空间。即使通过父节点root.SelectSingleNode()查找子节点,也必须提供命名空间。

 

接着上一个读取的例子,在root节点下添加子节点:

  1. //必须传递第二个参数,否则创建的节点是<news xmlns="">
  2.             XmlElement news1 = doc.CreateElement("news""http://www.163.com/rss/0.9");
  3.             XmlElement title1 = doc.CreateElement("title""http://www.163.com/rss/0.9");
  4.             title1.InnerText = "新加的一个标题";
  5.             news1.AppendChild(title1);
  6.             root.AppendChild(news1);
  7.             doc.Save("test3.xml");

保存后的test3.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.163.com/rss/0.9">
  <news>
    <title>这是标题</title>
  </news>
  <news>
    <title>新加的一个标题</title>
  </news>
</root>