C#的XML解析

来源:互联网 发布:淘宝抢购网 编辑:程序博客网 时间:2024/05/29 16:30

解析XML文件一般有两种模式:DOM模式和流模式。DOM模式的好处是允许编辑和更新XML文档,缺点是一次性加载整个文档到内存中。流模式则相反,内存中只有当前节点,但是是只读的,而且仅能向前,不能执行后导操作。

首先创建名为preson.xml的xml文件,所以方法都基于该xml文件,内容如下:

<?xml version="1.0" encoding="utf-8">

<user>

    <preson name="fengyun" >

        <pass>hutong</pass>

        <address>yunnan</address>

    </person>

<user>

 

1、XmlDocument

1.1 XmlNote与XmlElement的区别

在使用XmlDocument解析XML文件时,XmlNote和XmlElement经常被使用到的类,所以有必须详细了解这两个类的使用以及他们之间的关系。

  • XmlNote是所有Node的父类。XmlElement继承自XmlLinkedNode,而XmlLinkedNode又继承自XmlNote,所以XmlNote也是XmlElement的父类
  • XmlElement是具现类,可以直接实例化。XmlNote是抽象类,必须通过XmlDocument实例的CreateNode创建
  • XmlElement拥有众多对Attribute操作的方法,可以方便的对属性进行读写

1.2 XmlDocument的方法

  • XmlNote AppendChild(XmlNote newChild)——将指定的节点添加到当前元素的子节点列表的末尾
  • XmlNote Clone()——克隆当前元素实例
  • XmlNote CloneNote(bool deep)——根据deep判断是否克隆当前元素的子节点
  • string GetAttribute(string name)——返回当前元素指定的属性值
  • XmlAttribute GetAttributeNode(string name)——返回指定名称的属性节点
  • bool HasAttribute(string name)——返回当前节点是否包含指定名称的属性
  • void RemoveAttribute(string name)——根据指定的名称移除属性
  • SetAttribute(string name, string value)——根据指定的名称设置属性值
  • void WriteTo(XmlWriter w)——将当前节点写入XmlWriter

1.3XmlDocumnet的属性

  • XmlAttributeCollection Attributes——返回当前元素属性列表
  • XmlNodeList ChildNodes——返回当前节点的子节点列表
  • bool HasChildNodes——返回当前节点是否包含子节点
  • string InnerText——获取或设置节点及其所有子节点的串联值
  • string InnerXml——获取或指定包含当前元素内所有子节点的、包含结构标志的XML文本
  • string Name——获取节点的限定名
  • string Value——获取或设置节点的值

1.4 通过xmlDocument创建xml文件

class Program

{

    static void Main(string[] args)

    {

        XmlDocument xmlDoc = New XmlDocumnet();

        xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "yes");

        XmlElement root = xmlDoc.CreateElement("user");  //创建根节点

       

        XmlElement preson = xmlDoc.CreateElement("preson")  //创建子节点

        preson.SetAttribute("name", "zhang");  //设置子节点属性

        XmlElement pass = xmlDoc.CreateElement("pass");    //创建pass子节点

        pass.InnerText = "hotong";

        XmlElement address = xmlDoc.CreateElement("address");

        address.InnerText = "beijing";

        // 将各个子节点添加至节点中

        preson.AppendChild(pass);

        preson.AppendChild(address);

        root.AppendChild(preson);

        xmlDoc.AppendChild(root);

        // 将xml文件保存至指定位置

        xmlDoc.Save(@"d:user.xml");

    }

}

1.5 通过XmlDocument解析Xml文件

class Program

{

    static void Main(string[] args)

    {

        XmlDocument xmlDoc = new XmlDocumnet();

        xmlDoc.Load(@"d:user.xml");

        xmlNote root = xmlDoc.SelectSingleNode("user");

        forech(XmlDocument preson in root.ChildNodes)

        {

            string name = preson.GetAttributes["name"].Value;

            string pass = preson.ChildNode[0].InnerText;

            string address = preson.ChildNode[1].InnerText;

        }

    }

}

       

2、XML序列化与反序列化

序列化是将内存中的对象按照某种序列保存至本地的一种编程模式,而反序列化则相反,是将本地的数据读取至内存中。

本文只介绍Xml序列化,其实序列化可以是二进制的序列化,也可以是其他格式的序列化。

Xml序列化与反序列化主要使用XmlSerializer类完成。首先在使用构造函数创建XmlSerializer对象时传递序列化对象的Type,然后使用Serializer方法实现实现序列化,使用Deserializer实现反序列化。

创建一个被序列化和反序列化的对象

public class Preson

{

    public string Name {get; set;}

    public string Age {get; set;}

    public string Address {get; set;}

}

2.1 xml序列化

class Program

{  

    static void Main(string[] agrs)

    {

        Preson preson = new Preson();

        preson.Name = "zhang";

        preson.Age = "25";

        preson.Address = "beijing;

        // 创建本地文件,并将文件加载至流中

       using (FileStream fs = new FileStream(@"d: est.xml", FileMode.Create))

       {

            // 创建XmlSerialier对象,并指定序列化对象的Type

            XmlSerializer serializer = new XmlSeralizer(preson.GetType());

            serializer.Serializer(fs, user);   //将user对象数据序列化至fs流指定文件中

       }

    }

}

2.2 xml反序列化

class Program

{

    static void Main(string[] agrs)

    {

        Preson preson = new Preson();

        using (FileStream fs = new FileStream(@"d: est.xml", FileMode.Open))

        {

            XmlSerializer serializer = new XmlSerializer(preson.GetType());

            // 反序列化fs流指定文件中的数据,Deserialier返回Object类型,所以进行类型转换

            preson = (Preson)serializer.Deserializer(fs);

        }

    }

}

原创粉丝点击