XmlDocument操作xml类
net2.0中增加了XmlDocument类用于创建编辑xml文件。这里做一个归纳总结。
1)XmlDocument有两个公开用于加载xml内容的方法:
1.1)Load(传入xml文件的绝对或者相对路径),
1.2)LoadXml(用于直接加载xml内容的字符串),
两者不可混淆。
2)XmlDocument中筛选xml节点有两个方法:
2.1)SelectSingleNode(根据指定的筛选条件筛选出符合条件的第一个记录)。
2.2)SelectNodes(根据指定的筛选条件筛选出符合条件的全部节点)。
此二者方法所接受的参数是XPath的筛选字符串,关于XPath可以参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp;同时,注意相对节点和绝对节点(参考我的博文:http://www.cnblogs.com/ServiceboyNew/archive/2012/05/13/2498444.html)。
3)Xml添加纪录:
3.1)AppendChild,追加记录(属于XmlNode的一个方法,在某个节点内部添加子节点;若内部已存在子节点,则追加到该节点的末尾)。例如:
[C#]
XmlDocument doc = new XmlDocument(); doc.LoadXml("<a><b>bbb</b></a>"); XmlElement ele = doc.CreateElement("c"); ele.InnerText = "ccc"; doc.DocumentElement.AppendChild(ele); Console.WriteLine(doc.DocumentElement.OuterXml);
[VB.NET]
Dim doc As New XmlDocument() doc.LoadXml("<a><b>bbb</b></a>") Dim ele As XmlElement = doc.CreateElement("c") ele.InnerText = "ccc" doc.DocumentElement.AppendChild(ele) Console.WriteLine(doc.DocumentElement.OuterXml)
3.2)任意位置插入节点:
InsertAfter(在指定节点之后插入节点),InsertBefore(在指定节点前插入节点)。
这两个方法第一个参数都是“要插入的节点”,而第二个参数是“相对”这个插入节点的原节点。此处注意——调用InsertAfter/Before的那个节点必须是“原节点”的容器(即包含原节点的父节点!)。例如我们在"<b>bbb</b>之前插入一个<c>ccc</c>节点,那么第一个参数自然是<c>ccc</c>,而第二个参数则是<b>bbb</b>,此时包含<b>bbb</b>的节点应该是doc.DocumentElement(即是<a>……</a>这部分!):
[C#]
XmlDocument doc = new XmlDocument(); doc.LoadXml("<a><b>bbb</b></a>"); XmlElement el = doc.CreateElement("c"); el.InnerText="ccc"; doc.DocumentElement.InsertBefore(el, doc.DocumentElement.FirstChild);
[VB.NET]
Dim doc As New XmlDocument() doc.LoadXml("<a><b>bbb</b></a>") Dim el As XmlElement = doc.CreateElement("c") el.InnerText = "ccc" doc.DocumentElement.InsertBefore(el, doc.DocumentElement.FirstChild)
4)删除&替换节点:
4.1)RemoveAll:是XmlNode的一个方法,用于删除指定节点的全部内部子节点。
4.2)RemoveChild,XmlNode的一个方法,用于删除指定节点的内部特定子节点,例如:
[C#]
XmlDocument doc = new XmlDocument(); doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>"); XmlNode node = doc.DocumentElement.SelectSingleNode("/a//b[@id='1']"); doc.DocumentElement.RemoveChild(node); Console.WriteLine(doc.OuterXml);
[VB.NET]
Dim doc As New XmlDocument() doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>") Dim node As XmlNode = doc.DocumentElement.SelectSingleNode("/a//b[@id='1']") doc.DocumentElement.RemoveChild(node) Console.WriteLine(doc.OuterXml)
调用删除节点方法的那个节点也必须是被删除节点的父节点(容器节点!)
4.3)替换节点:
注意事项同“删除”部分,该方法提供了两个参数——新节点和被替换节点。
[C#]
XmlDocument doc = new XmlDocument(); doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>"); XmlNode node = doc.DocumentElement.SelectSingleNode("/a//b[@id='1']"); XmlNode newnode = doc.CreateElement("d"); newnode.InnerText="ddd"; doc.DocumentElement.ReplaceChild(newnode, node); Console.WriteLine(doc.OuterXml);
[VB.NET]
Dim doc As New XmlDocument() doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>") Dim node As XmlNode = doc.DocumentElement.SelectSingleNode("/a//b[@id='1']") Dim newnode As XmlNode = doc.CreateElement("d") newnode.InnerText = "ddd" doc.DocumentElement.ReplaceChild(newnode, node) Console.WriteLine(doc.OuterXml)
5)更新节点:
5.1)更新节点内容(一对节点标志中的文字,比如bbb;直接查找到节点后设置InnerText)。
5.2)更新属性(把XmlNode先转化为XmlElement,然后调用其SetAttribute方法重置特定属性值即可)。
6)导入节点:
对于XmlDocument而言,CRUD的操作都是围绕着XmlNode进行。而这个XmlNode又是一个抽象类(究其原因,是因为一个xml不仅仅有xml节点(对应的类是XmlElement),而且还有其它节点(诸如 CData等……)),因此XmlNode无法直接New,只能通过XmlDocument实体的Create方法进行创建。不过需要注意——凡是对一个XmlDocument节点CRUD,那个节点必须是由该XmlDocument实体的Create方法创建的。否则会抛出“非本实体创建的XmlNode”等异常,例如以下程序是错误的!
[C#]
XmlDocument doc = new XmlDocument(); doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>"); XmlDocument doc2 = new XmlDocument(); XmlNode node = doc2.CreateElement("c"); node.InnerText = "ccc"; //此处发生错误!因为node是另外一个XmlDocument创建的! doc.DocumentElement.InsertAfter(node, doc.DocumentElement.FirstChild);
[VB.NET]
Dim doc As New XmlDocument() doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>") Dim doc2 As New XmlDocument() Dim node As XmlNode = doc2.CreateElement("c") node.InnerText = "ccc" '此处发生错误!因为node是另外一个XmlDocument创建的! doc.DocumentElement.InsertAfter(node, doc.DocumentElement.FirstChild)
那么如何把两个处于不同实体的节点导入到一个XmlDocument中去呢?可以使用ImportXml方法。该方法两个参数——第一个是来自于其它XmlDocument的节点,第二个布尔类型(来自于其它XmlDocument节点中是否连同子节点一并拷贝)。
[C#]
XmlDocument doc = new XmlDocument(); doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>"); XmlDocument doc2 = new XmlDocument(); doc2.LoadXml("<a><d>ddd</d></a>"); //把第二个xml的内容全部导入到第一个<a>下 doc.DocumentElement.AppendChild(doc.ImportNode(doc2.DocumentElement, true)); Console.WriteLine(doc.OuterXml);
[VB.NET]
Dim doc As New XmlDocument() doc.LoadXml("<a><b id='1'>bbb</b><b id='2'>bbb</b></a>") Dim doc2 As New XmlDocument() doc2.LoadXml("<a><d>ddd</d></a>") '把第二个xml的内容全部导入到第一个<a>下 doc.DocumentElement.AppendChild(doc.ImportNode(doc2.DocumentElement, True)) Console.WriteLine(doc.OuterXml)
7)其它属性:
7.1)InnerText:除去当前节点之外内部所有节点(一对节点中间的)普通文本。
7.2)InnerHtml:除去当前节点之外内部所有节点的Xml显示。
7.3)Value:直接来自于父类XmlNode,但是XmlElement没有此值,也不是每个节点都有(具体参考:http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnode.value)。