zoukankan      html  css  js  c++  java
  • 基于xml技术的操作

         Xml是一种存放文件的一个文件格式,在程序的开发中应用很广泛,下面就来看看如何通过DOM的方式处理Xml格式的数据。DOM(Document Object Model,文档对象模型),DOM是处理Xml数据的国际通用数据模型,由于Xml以元素为单位,就一个根节点,所有非常适合树的形式表达,DOM将xml格式的看出一棵树,并定义了一种将xml文档中的元素和属性对应特点节点,因此,可以认为Dom定义了xml在内存中的表示形式!

         既然可以把xml文档可以转换成内存中的DOM树,那么我们就可以通过程序对XML进行操作了,由此可见DOM处理xml的重要性,下面介绍几个常见对XML处理的类

        1、XmlNode类

            .net中定义了1个抽象类XmlNode类来表示XML树中的所有节点,包括很多Xml文档操作的属性和方法,如Arributes,ChildNodes,FirstChild,AppendChild(),InsertAfter()等等,在用的时候慢慢体会就可以了

       2、XmlDocument类

           XmlDocument类扩展了XmlNode,并代表XML文档。它是内存的读取器,在内存中将xml数据用树形结构来表达,,它允许往返遍历树的各个节点,允许对节点进行读取和修改,也包括很多属性和方法,事件等,集中load方法是将xml文档加载到内存中的。

     下面就来详细介绍下对xml的操作,包括读写更新等操作,以下面的xml文件为例

    View Code
    <?xml version="1.0" encoding="utf-8" ?>
    <Users>
      <User id="0">
        <Name>Jeffrey</Name>
        <Sex>男</Sex>
        <UserName>Jeffrey</UserName>
      </User>
        <User id="1">
        <Name>Tom</Name>
        <Sex>男</Sex>
        <UserName>tom</UserName>
      </User>
      <User id="2">
        <Name>Jef</Name>
        <Sex>女</Sex>
        <UserName>jef</UserName>
      </User>
      <User id="3">
        <Name>1</Name>
        <Sex></Sex>
        <UserName>1</UserName>
      </User>
    </Users>

         一、读取

         操作xml文件之前首先我们需要创建xml文档读取器,并将xml文件加载到内存中

    View Code
                XmlDocument xdoc = new XmlDocument();
                xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");

         其次,我们来搞清几个节点类

         XmlNodeList:所有节点的集合,无论是父节点还是子节点

         XmlNode:xml文档中的单个节点

         XmlAttribute:单个节点中的属性,可以通过Name获得值

          弄清楚了上面的三个节点类后,我们就可以根据需要获得对应的元素了,下面我们来看看如何获得它们

          a.首先我们来获得节点集合xmlNodeList

          

    View Code
                XmlNodeList list = xdoc.SelectNodes("/Users/User");
                foreach (XmlNode node in list)
                {
                    listBox1.Items.Add(node.ChildNodes.Item(0).InnerText);
                }

    SelectNodes方法主要用来获得节点集合的方法,括号里的参数主要是用来说明要显示的节点集合,比如/Users就是显示Users的集合,/Users/User就是User的节点集合等,然后循环出来就可以了,我们也可以根据条件进行筛选,比如根据子节点的属性值,子节点的节点值等,举个例子

    比如我要显示子节点中sex为男的所有User节点集合,那么我们就可以这样写

             View Code

              XmlNodeList list = xdoc.SelectNodes("/Users/User[Sex='男']");
                foreach (XmlNode node in list)
                {
                    listBox1.Items.Add(node.ChildNodes.Item(0).InnerText);
                }

            或者根据子节点属性来筛选,比如读取user中id>2的节点 

    View Code
       XmlNodeList list = xdoc.SelectNodes("/Users/User");
                foreach (XmlNode node in list)
                {
                    if (Convert.ToInt32(node.Attributes["id"].Value)>2)
                    {
                        listBox1.Items.Add(node.ChildNodes.Item(0).InnerText);
                    }
                   
                }

             b、获得单个节点XmlNode

           

    View Code
               XmlNode xnode = xdoc.SelectSingleNode("//User[Name='Jeffrey']");

                listBox1.Items.Add(xnode.Attributes["id"].Value);

    这里面使用了SelectSingleNode来获得单个节点,需要说明的是里面的参数同上,只是为了精确,最好都是加上条件的,或者通过其他的FirstChild等也可以获得

           c、获得单个节点XmlAttribute,这个我们只需要遍历单个节点的属性,就可以获得,下面举个例子,比如对下面的xml操作

              

    View Code
    <?xml version="1.0" encoding="utf-8" ?>
    <Products>
      <Product id="0" proName="手机" proPrice="1200" proInfo="手机手机手机手机手机手机"></Product>
      <Product id="1" proName="电脑" proPrice="3200" proInfo="电脑电脑电脑电脑电脑电脑"></Product>
      <Product id="5" proName="mp3" proPrice="200" proInfo="mp3mp3mp3mp3mp3mp3mp3mp3mp3"></Product>
      <Product id="3" proName="mp4" proPrice="400" proInfo="mp4mp4mp4mp4mp4mp4mp4mp4mp4"></Product>
      <Product id="4" proName="mp5" proPrice="500" proInfo="mp5mp5mp5mp5mp5mp5mp5mp5mp5"></Product>
    </Products>

     看看下面的源码,实现了DataTable和xml节点属性的使用

    View Code
     public static DataTable GetProduct(string path)
            {

               //创建XmlDocument类的实例
                XmlDocument xmldocument = new XmlDocument();

               //加载xml文件
                xmldocument.Load(path);

               //通过SelectSingleNode方法获得根节点
                XmlNode xmlNode = xmldocument.SelectSingleNode("Products");

               //判断根节点和根节点下是否为空
                if (xmlNode==null)
                {
                    return null;
                }
                if(xmlNode.ChildNodes.Count<=0)
                {
                    return null;
                }

               //创建DataTable对象
                DataTable dt = new DataTable();

               //读取xml根节点下第一个节点的属性值到DataTable的列中,用来定义DataTable结构
                foreach (XmlAttribute att in xmlNode.ChildNodes[0].Attributes)
                {
                    dt.Columns.Add(new DataColumn(att.Name,typeof(string)));
                }

               //获取XML节点下的所有节点
                XmlNodeList nodeList = xmldocument.SelectNodes("/Products/Product");

               //遍历所有节点
                foreach (XmlNode xn in nodeList)
                {

                    //定义行
                    DataRow dr = dt.NewRow();

                    //在行中添加数据
                    foreach (DataColumn column in dt.Columns)
                    {
                        dr[column] = xn.Attributes[column.ColumnName].Value;
                    }

                  // 将行添加到表格中
                    dt.Rows.Add(dr);
                }

                //返回DataTable对象dt即可
                return dt;
            }

    理解了上面的这些后,我们就可以很灵活的对xml进行操作了,比如结合DataSet的使用,因为有的时候,我们需要xml的数据读取到DataSet中去操作,从而进行绑定数据集,获取值等,比如对products.xml这个来说,有个简单的加载到dataset的方法

    View Code
      StringReader reader = new StringReader(Node.OuterXml);//将找到的数据加入到新生成的reader数据流中。
                ds.ReadXml(reader);//以XML方式读取到dataset中。

     二、增加xml节点

          增加节点无非就是增加子节点,增加节点的属性和节点值等,就以上面Users.xml为例子,看看如何操作

          首先需要加载xml文档到内存中,创建读写器   

    View Code
                XmlDocument xdoc = new XmlDocument();
                xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");

         其次,需要制定xpath,就是将节点加到上面地方,在这里我们需要加载到Users下面

    View Code
       XmlNode xnode = xdoc.SelectSingleNode("//Users");

         现在,我们先创建一个User节点

    View Code
           XmlNode newNode = xdoc.CreateNode(XmlNodeType.Element, "User"null);

         我们看到User节点里会有一个id属性,而且还有值,那么我们就要创建一个id属性,添加到newNode节点中

    View Code
           XmlAttribute idattr = xdoc.CreateAttribute("id",null);
           idattr.Value = id;
           newNode.Attributes.Append(idattr);   

           然后,我们在创建User下面的子节点Name,sex,username,从而添加到newNode中  

    View Code
                //创建User下面的子节点
                XmlNode nameNode = xdoc.CreateNode(XmlNodeType.Element, "Name"null);
                nameNode.InnerText = textBox3.Text;
                newNode.AppendChild(nameNode);

                XmlNode sexNode = xdoc.CreateNode(XmlNodeType.Element, "Sex"null);
                sexNode.InnerText = textBox4.Text;
                newNode.AppendChild(sexNode);

                XmlNode unNode = xdoc.CreateNode(XmlNodeType.Element, "UserName"null);
                unNode.InnerText = textBox2.Text;
                newNode.AppendChild(unNode);

          最后,将newNode添加到父节点Users中,保存xml文档即可

    View Code
               xnode.AppendChild(newNode);
               xdoc.Save(System.Environment.CurrentDirectory + "\\UsersXml.xml");

         我们可以发现,无论是创建节点还是属性,都是通过xmldocument来创建的

    三、修改节点

        这个思路也很简单,只要我们获取需要修改的节点,然后在重新赋值就可以了,可以根据参数获得,也可以使用属性判断,总之方式很多,简单的写了个例子

       

    View Code
     XmlDocument xdoc = new XmlDocument();
                xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");
                
                string username = textBox2.Text;
                string name = textBox3.Text;
                string sex = textBox4.Text;

                XmlNode node = xdoc.SelectSingleNode("/Users/User[Name='测试']");
                node.ChildNodes.Item(0).InnerText = name;
                node.ChildNodes.Item(1).InnerText = sex;
                node.ChildNodes.Item(2).InnerText = username;

             
                xdoc.Save(System.Environment.CurrentDirectory + "\\UsersXml.xml");

    四、删除节点

          获得要删除的节点,调用removeChild方法进行移除

    View Code
      XmlDocument xdoc = new XmlDocument();
                xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");
                string username = textBox1.Text;
                XmlNode node = xdoc.SelectSingleNode("/Users/User[Name='" + username + "']");
                XmlNode ParentNode = node.ParentNode;
                ParentNode.RemoveChild(node);
                xdoc.Save(System.Environment.CurrentDirectory + "\\UsersXml.xml");

    上面就是简单的对xml的操作,可以灵活变通,通过序列化,也可以完成相关操作

    多思考,多创新,才是正道!
  • 相关阅读:
    《译》准备做一些 AR/增强现实的 翻译
    (转)两张Firefox OS 系统截图
    Hello World!
    centos7安装docker
    linux用户及组相关命令
    Go 系列教程 ——第 30 篇:错误处理
    Go 系列教程 ——第 29 篇:Defer
    linux远程管理相关命令
    linux文件目录相关命令
    centos7安装mysql-8.0.15
  • 原文地址:https://www.cnblogs.com/shuang121/p/1961269.html
Copyright © 2011-2022 走看看