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文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </Root>
使用如下代码就可以创建该文件:
- XmlDocument doc = new XmlDocument();
- XmlDeclaration xd = doc.CreateXmlDeclaration("1.0", "utf-8", null);
- doc.AppendChild(xd);
- XmlElement root = doc.CreateElement("Root");
- doc.AppendChild(root);
- for (int i = 0; i < 2; i++)
- {
- XmlElement nodeTest = doc.CreateElement("NodeTest");
- nodeTest.InnerText = Convert.ToString(i + 1);
- XmlAttribute xa = doc.CreateAttribute("id");
- xa.Value = i.ToString();
- nodeTest.Attributes.Append(xa);
- root.AppendChild(nodeTest);
- }
- doc.Save("e://1.xml");
下面我们来说说如何使用XPath进行查询
如果我要找到id为1的NodeTest的节点,那么我们应该使用如下代码
- XmlDocument doc = new XmlDocument();
- doc.Load(filePath);
- XmlNode node = doc.SelectSingleNode("/Root/NodeTest[@id='1']");
删除节点很简单,调用RemoveChild方法就可以了,例如上面删除找到的节点,那么使用如下代码
- node.ParentNode.RemoveChild(node);
- 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
- <?xml version="1.0" encoding="utf-8"?>
- <Root xmlns="http://www.w3.org">
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </Root>
使用上面的查找代码你会发现node为null,为什么会出现这种情况呢?那就是命名空间在作怪,此时应该使用如下代码来获取节点
- XmlDocument doc = new XmlDocument();
- doc.Load(filePath);
- XmlNamespaceManager nm = new XmlNamespaceManager(doc.NameTable);
- nm.AddNamespace("uu", "http://www.w3.org");
- XmlNode node = doc.SelectSingleNode("/uu:Root/uu:NodeTest[@id='1']", nm);
假设有如下两个XML
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <NodeTests>
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </NodeTests>
- <CombinNode></CombinNode>
- </Root>
- <Dictrionary>
- <A>
- <Dic name="Aa" />
- <Dic name="Ac" />
- <Dic name="Awa" />
- </A>
- <DDD>
- <Dic name="Ba" />
- <Dic name="Bc" />
- <Dic name="Bz" />
- </DDD>
- </Dictrionary>
想要合并后得到如下的XML
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <NodeTests>
- <NodeTest id="0">1</NodeTest>
- <NodeTest id="1">2</NodeTest>
- </NodeTests>
- <CombinNode>
- <A>
- <Dic name="Aa" />
- <Dic name="Ac" />
- <Dic name="Awa" />
- </A>
- <DDD>
- <Dic name="Ba" />
- <Dic name="Bc" />
- <Dic name="Bz" />
- </DDD>
- </CombinNode>
- </Root>
那么使用如下代码就可以了
- XmlDocument doc1 = new XmlDocument();
- doc1.Load("e://1.xml");
- XmlNode node1 = doc1.SelectSingleNode("/Root/CombinNode");
- XmlDocument doc2 = new XmlDocument();
- doc2.Load("e://2.xml");
- XmlNode node2 = doc2.SelectSingleNode("/Dictrionary");
- node1.InnerXml = node2.InnerXml;
- doc1.Save("e://1.xml");
欢迎转载,请注明出处~~