zoukankan      html  css  js  c++  java
  • 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)。

  • 相关阅读:
    Java框架spring学习笔记(十七):事务操作
    Java框架spring 学习笔记(十六):c3p0连接池的配置以及dao使用jdbcTemplate
    Java框架spring 学习笔记(十五):操作MySQL数据库
    Java框架spring 学习笔记(十四):注解aop操作
    Java框架spring 学习笔记(十三):log4j介绍
    Java框架spring 学习笔记(十二):aop实例操作
    Java框架spring 学习笔记(十一):aop相关概念
    Java框架spring 学习笔记(十):bean管理(注解和配置文件混合使用)
    Java框架spring 学习笔记(九):Spring的bean管理(@Required、@Component、@Autowired、@Resource注解)
    Java框架spring 学习笔记(八):注入对象类型属性
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/2631779.html
Copyright © 2011-2022 走看看