基于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的操作,可以灵活变通,通过序列化,也可以完成相关操作

posted @ 2011-02-22 14:19  双魂人生  阅读(1044)  评论(0编辑  收藏  举报