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)。

posted @ 2012-08-10 14:38  Serviceboy  阅读(1414)  评论(0编辑  收藏  举报