在.NET中操作XML(一)

        XML发展到今天已经是非常成熟的东西了,但是经常在论坛上会看到有人问如何操作XML,简单的总结一下,以备以后回答问题之需。

        有兴趣的同学可以参考MSDN的System.Xml和System.Xml.XPath命名空间下的类。这篇主要讲讲如何使用XmlDocument配合XPath进行XML的操作,有关XmlDocument和XPath的更多信息,请参考MSDN(http://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument(VS.80).aspx和http://msdn.microsoft.com/zh-cn/library/ms256471(VS.80).aspx)以及 W3C(http://www.w3.org/TR/xpath)

        XPath主要的作用是用来查找符合条件的节点的,对于复杂的XML来说那是相当的有用,所以掌握XPath的语法还是非常重要的

        下面举几个简单的例子来说明一下。例如有XML文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Root>
  3.   <NodeTest id="0">1</NodeTest>
  4.   <NodeTest id="1">2</NodeTest>
  5. </Root>

使用如下代码就可以创建该文件:

  1. XmlDocument doc = new XmlDocument();
  2. XmlDeclaration xd = doc.CreateXmlDeclaration("1.0""utf-8"null);
  3. doc.AppendChild(xd);
  4. XmlElement root = doc.CreateElement("Root");
  5. doc.AppendChild(root);
  6. for (int i = 0; i < 2; i++)
  7. {
  8.     XmlElement nodeTest = doc.CreateElement("NodeTest");
  9.     nodeTest.InnerText = Convert.ToString(i + 1);
  10.     XmlAttribute xa = doc.CreateAttribute("id");
  11.     xa.Value = i.ToString();
  12.     nodeTest.Attributes.Append(xa);
  13.     root.AppendChild(nodeTest);
  14. }
  15. doc.Save("e://1.xml");

下面我们来说说如何使用XPath进行查询

如果我要找到id为1的NodeTest的节点,那么我们应该使用如下代码

  1. XmlDocument doc = new XmlDocument();
  2. doc.Load(filePath);
  3. XmlNode node = doc.SelectSingleNode("/Root/NodeTest[@id='1']");

删除节点很简单,调用RemoveChild方法就可以了,例如上面删除找到的节点,那么使用如下代码

  1. node.ParentNode.RemoveChild(node);
  2. doc.Save(filePath);

修改节点的名称,貌似MS没有提供方法,所以一般来说只能先删除在添加

简单的增删改查已经说完了,下面说说带有命名空间的XML的操作

所谓XML的命名空间,有关更详细的信息,请参考MSDN(http://msdn.microsoft.com/zh-cn/library/c1a6xs06(VS.80).aspx)

这里主要会用到XmlNamespaceManager这个类,有关这个类的详细信息,请参考MSDN(http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnamespacemanager(VS.80).aspx)

假设有如下XML

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Root xmlns="http://www.w3.org">
  3.   <NodeTest id="0">1</NodeTest>
  4.   <NodeTest id="1">2</NodeTest>
  5. </Root>

使用上面的查找代码你会发现node为null,为什么会出现这种情况呢?那就是命名空间在作怪,此时应该使用如下代码来获取节点

  1. XmlDocument doc = new XmlDocument();
  2. doc.Load(filePath);
  3. XmlNamespaceManager nm = new XmlNamespaceManager(doc.NameTable);
  4. nm.AddNamespace("uu""http://www.w3.org");
  5. XmlNode node = doc.SelectSingleNode("/uu:Root/uu:NodeTest[@id='1']", nm);
另外在操作XML的时候,会碰到合并两个XML文档的操作,此时可以利用InnerXml和OuterXml两个属性,直接拼接字符串,这样就避免了过多的节点操作

假设有如下两个XML

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Root>
  3.   <NodeTests>
  4.       <NodeTest id="0">1</NodeTest>
  5.       <NodeTest id="1">2</NodeTest>
  6.   </NodeTests>
  7.   <CombinNode></CombinNode>
  8. </Root>
  1. <Dictrionary>
  2.   <A>
  3.     <Dic name="Aa" />
  4.     <Dic name="Ac" />
  5.     <Dic name="Awa" />
  6.   </A>
  7.   <DDD>
  8.     <Dic name="Ba" />
  9.     <Dic name="Bc" />
  10.     <Dic name="Bz" />
  11.   </DDD>
  12. </Dictrionary>

想要合并后得到如下的XML

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Root>
  3.   <NodeTests>
  4.       <NodeTest id="0">1</NodeTest>
  5.       <NodeTest id="1">2</NodeTest>
  6.   </NodeTests>
  7.   <CombinNode>
  8.       <A>
  9.         <Dic name="Aa" />
  10.         <Dic name="Ac" />
  11.         <Dic name="Awa" />
  12.       </A>
  13.       <DDD>
  14.         <Dic name="Ba" />
  15.         <Dic name="Bc" />
  16.         <Dic name="Bz" />
  17.       </DDD>
  18.   </CombinNode>
  19. </Root>

那么使用如下代码就可以了

  1. XmlDocument doc1 = new XmlDocument();
  2. doc1.Load("e://1.xml");
  3. XmlNode node1 = doc1.SelectSingleNode("/Root/CombinNode");
  4. XmlDocument doc2 = new XmlDocument();
  5. doc2.Load("e://2.xml");
  6. XmlNode node2 = doc2.SelectSingleNode("/Dictrionary");
  7. node1.InnerXml = node2.InnerXml;
  8. doc1.Save("e://1.xml");

 

欢迎转载,请注明出处~~

 

 

 

你可能感兴趣的:(c,xml,.net,null,文档,encoding)