C#操作XML

  1. 云栖社区>
  2. 博客>
  3. 正文

C#操作XML

杰克.陈 2014-02-18 13:49:00 浏览543
展开阅读全文

原文 C#操作XML

C#操作XML

 

 

1. .NET对读写XML文件的支持....................... 1

 

 

(1) System.Xml命名空间............................ 1

 

 

(2) System.Xml.XPath命名空间................ 2

 

 

(3) System.Xml.Xsl命名空间.................... 2

 

 

(4) System.Xml.Linq命名空间.................. 2

 

 

2. 使用XmlReader、XmlWriter简单的读写XML(只进读写)   2

 

 

(1) System.Xml命名空间............................ 2

 

 

(2) 使用XmlReader类读XML文件.............. 3

 

 

(3) 使用XmlReader类进行验证XML文件.. 3

 

 

(4) 使用XmlWriter类写XML文件.............. 4

 

 

3. 使用XmlDocument、XmlNode实现DOM读写XML   5

 

 

(1) 测试的XML文件(XML.xml)................... 5

 

 

(2) 测试查找与插入节点的代码.................. 5

 

 

4. 使用XPathNavigator类快速查询XML文档元素  6

 

 

(1) System.Xml.XPath命名空间................ 6

 

 

(2) XPathNavigator类介绍........................ 6

 

 

(3) 使用XPathNavigator对象查询XML元素    6

 

 

(4) 使用XPathNavigator对象查询并修改XML元素 7

 

 

5. XSL转换数据格式........................................ 7

 

 

(1) System.Xml.Xsl命名空间.................... 7

 

 

(2) 使用XslCompiledTransform类转换数据格式    7

 

 

(3) 使用XsltArgumentList类绑定对象到命名空间    8

 

 

(4) 调试XSLT................................................ 9

 

 

6. 在XML中序列化对象.................................... 9

 

 

(1) .NET对象序列化的方式介绍................. 9

 

 

(2) 使用XmlSerializer序列化与反序列化 9

 

 

7. 使用LINQ查询XML文档............................ 10

 

 

(1) System.Xml.Linq命名空间................ 10

 

 

(2) System.Xml.Linq命名空间类的基本使用   10

 

 

(3) 查询静态的XML文档............................ 11

 

 

(4) 查询动态的XML.................................... 11

 

 

  

 

 

 

 

 

1..NET对读写XML文件的支持

 

 

(1)System.Xml命名空间

 

 

System.Xml命名空间为处理XML提供基于标准的支持,其中提供了许多管理XML文档和XML流方式的类,还提供了一些类(例如XmlDataDocument)则是提供了XML数据存储器和存储在DataSet中的关系数据之间的桥梁。

 

 

以下是System.Xml命名空间读写XML较重要的类:

 

 

XmlReader

 

 

表示提供XM数据进行快速、非缓存、只进访问的读取器。

 

 

XmlWriter

 

 

提供一种快速、非缓存和只进的方式来生成包含XML数据的流或文件。

 

 

XmlTextReader

 

 

表示提供对XML数据进行快速、非缓存、只进访问的读取器。

 

 

XmlTextWriter

 

 

表示提供快速、非缓存、只进方法的编写器,生成包含XML数据的流或文件。

 

 

XmlResolver

 

 

解析由统一资源标识符 URI)命名的外部 XML 资源。

 

 

XmlUrlResolver

 

 

解析由统一资源标识符(URI 命名的外部 XML 资源。

 

 

XmlDataDocument

 

 

允许通过相关的DataSet存储、检索和操作结构化数据。

 

 

以下是System.Xml命名空间对读写XML文件支持的基础类:

 

 

XmlDocument

 

 

表示 XML 文档。

 

 

XmlComment

 

 

表示 XML 注释的内容。

 

 

XmlDocumentType

 

 

表示文档类型声明。

 

 

XmlDeclaration

 

 

表示 XML 声明节点:<?xml version='1.0'...?>。

 

 

XmlNode

 

 

表示 XML 文档中的单个节点。

 

 

XmlNodeList

 

 

表示排序的节点集合。

 

 

XmlElement

 

 

表示一个元素。

 

 

XmlAttribute

 

 

表示一个属性。

 

 

XmlText

 

 

表示元素或属性的文本内容。

 

 

XmlEntity

 

 

表示实体声明,例如 <!ENTITY... >.

 

 

XmlEntityReference

 

 

表示实体引用节点

 

 

(2)System.Xml.XPath命名空间

 

 

System.Xml.XPath命名空间中包含的类用于定义光标模型,该模型可将 XML 信息项作为 XQuery 1.0 和 XPath 2.0 数据模型的实例进行导航和编辑。

 

 

System.Xml.XPath命名空间重要的类:

 

 

XPathDocument

 

 

提供整个XML文档的视图,只读

 

 

XPathNavigator

 

 

为定位和编辑 XML 数据提供游标模型。

 

 

XPathNodeIterator

 

 

在一组选中的节点上提供迭代器。

 

 

XPathItem

 

 

表示 XQuery 1.0 和 XPath 2.0 数据模型中的项。

 

 

XPathExpression

 

 

提供表示已编译的 XPath 表达式的类型化类。

 

 

XPathException

 

 

提供在处理 XPath 表达式的过程中发生错误时所引发的异常。

 

 

(3)System.Xml.Xsl命名空间

 

 

System.Xml.Xsl命名空间为“可扩展样式表转换”(XSLT) 转换提供支持。它支持“W3C XSL 转换 (XSLT) 1.0 版推荐”(www.w3.org/TR/xslt)。

 

 

System.Xml.Xsl命名空间重要的类:

 

 

XslCompiledTransform

 

 

使用 XSLT 样式表转换 XML 数据。

 

 

XsltArgumentList

 

 

包含数目可变的参数(这些参数是 XSLT 参数,或者是扩展对象)。

 

 

XsltContext

 

 

可扩展样式表转换语言 (XSLT) 处理器的当前执行上下文。 

 

 

XsltSettings 

 

 

指定执行 XSLT 样式表时要支持的 XSLT 功能。

 

 

(4)System.Xml.Linq命名空间

 

 

包含LINQ to XML的类。LINQ to XML是内存中的XML编程接口,使您可以轻松有效地修改XML文档。使用LINQ to XML可以进行以下操作:从文件或流加载XML;将XML序列化为文件或流;使用功能构造从头创建XML树;使用LINQ查询来查询XML树;操作内存中的XML树;使用XSD验证XML树。组合使用这些功能将XML树从一种形状转换为另一种形状。

 

 

System.Xml.Linq命名空间较重要的类:

 

 

XDocument

 

 

表示 XML 文档。

 

 

XComment

 

 

表示一个 XML 注释。

 

 

XNamespace

 

 

表示一个 XML 命名空间。无法继承此类。

 

 

XNode

 

 

表示 XML 树中节点的抽象概念(元素、注释、文档类型、处理指令或文本节点)。

 

 

XElement

 

 

表示一个 XML 元素。

 

 

XAttribute

 

 

表示一个 XML 属性。

 

 

XName

 

 

表示 XML 元素或属性的名称。

 

 

XText

 

 

表示一个文本节点。

 

 

2.使用XmlReader、XmlWriter简单的读写XML(只进读写)

 

 

(1)System.Xml命名空间

 

 

System.Xml命名空间为处理XML提供基于标准的支持,其中提供了许多管理XML文档和XML流方式的类,还提供了一些类(例如XmlDataDocument)则是提供了XML数据存储器和存储在DataSet中的关系数据之间的桥梁。

 

 

以下是System.Xml命名空间读写XML较重要的类:

 

 

XmlReader

 

 

表示提供XM数据进行快速、非缓存、只进访问的读取器。

 

 

XmlWriter

 

 

提供一种快速、非缓存和只进的方式来生成包含XML数据的流或文件。

 

 

XmlTextReader

 

 

表示提供对XML数据进行快速、非缓存、只进访问的读取器。

 

 

XmlTextWriter

 

 

表示提供快速、非缓存、只进方法的编写器,生成包含XML数据的流或文件。

 

 

XmlResolver

 

 

解析由统一资源标识符 URI)命名的外部 XML 资源。

 

 

XmlUrlResolver

 

 

解析由统一资源标识符(URI 命名的外部 XML 资源。

 

 

XmlDataDocument

 

 

允许通过相关的DataSet存储、检索和操作结构化数据。

 

 

以下是System.Xml命名空间对读写XML文件支持的基础类:

 

 

XmlDocument

 

 

表示 XML 文档。

 

 

XmlComment

 

 

表示 XML 注释的内容。

 

 

XmlDocumentType

 

 

表示文档类型声明。

 

 

XmlDeclaration

 

 

表示 XML 声明节点:<?xml version='1.0'...?>。

 

 

XmlNode

 

 

表示 XML 文档中的单个节点。

 

 

XmlNodeList

 

 

表示排序的节点集合。

 

 

XmlElement

 

 

表示一个元素。

 

 

XmlAttribute

 

 

表示一个属性。

 

 

XmlText

 

 

表示元素或属性的文本内容。

 

 

XmlEntity

 

 

表示实体声明,例如 <!ENTITY... >.

 

 

XmlEntityReference

 

 

表示实体引用节点

 

 

(2)使用XmlReader类读XML文件

 

 

要读取的XML文件(XML.xml)内容:

 

 

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

 

 

<根节点>

 

 

  <字符串>测试字符串!!!ABCD</字符串>

 

 

  <数字 属性1="李志伟" 属性2="lizhiwei">123.456</数字>

 

 

</根节点>

 

 

读取的XML文件内容的代码:

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XmlReader rxml = XmlReader.Create(@"..\..\XML\XML.xml");

 

 

            while (rxml.Read())//读取节点

 

 

            { //操作当前节点

 

 

                Console.WriteLine("节点名:" + rxml.Name + "\t节点类型:" + rxml.NodeType);

 

 

                for (int i = 0; i < rxml.AttributeCount; i++)

 

 

                {

 

 

                    Console.WriteLine("属性:"+rxml.GetAttribute(i));//读取属性

 

 

                }

 

 

                if (rxml.Name == "数字")

 

 

                { //读取数字

 

 

                    Console.WriteLine("数字值:" + rxml.ReadElementContentAsDouble()*100);

 

 

                }

 

 

                else if (rxml.Name == "字符串")

 

 

                {//读取字符串

 

 

                    Console.WriteLine("字符串值:" + rxml.ReadElementContentAsString());

 

 

                }

 

 

                Console.WriteLine("====================================================");

 

 

            }

 

 

            rxml.Close();

 

 

            Console.Read();

 

 

        }

 

 

    }

 

 

(3)使用XmlReader类进行验证XML文件

 

 

XML.xml文件不变,增加XMLSchema.xsd文件如下:

 

 

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

 

 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

 

 

  <xs:element name="根节点">

 

 

    <xs:complexType>

 

 

      <xs:sequence>

 

 

        <xs:element name="字符串" type="xs:string"/>

 

 

        <xs:element name="数字">

 

 

          <xs:complexType>

 

 

            <xs:attribute name="属性1" type="xs:string"/>

 

 

            <!-- 未定义属性2-->

 

 

          </xs:complexType>

 

 

        </xs:element>

 

 

      </xs:sequence>

 

 

    </xs:complexType>

 

 

  </xs:element>

 

 

</xs:schema>

 

 

程序代码:

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XmlReaderSettings settings = new XmlReaderSettings();

 

 

            settings.Schemas.Add(null, @"..\..\XML\XMLSchema.xsd");

 

 

            settings.ValidationType = ValidationType.Schema;

 

 

            settings.ValidationEventHandler += new ValidationEventHandler(Error);

 

 

            XmlReader rxml = XmlReader.Create(@"..\..\XML\XML.xml", settings);

 

 

            while (rxml.Read())//读取节点

 

 

            {//操作当前节点

 

 

                Console.WriteLine("节点名:" + rxml.Name + "\t节点类型:" + rxml.NodeType);

 

 

                for (int i = 0; i < rxml.AttributeCount; i++)

 

 

                {

 

 

                    Console.WriteLine("属性:"+rxml.GetAttribute(i));//读取属性

 

 

                }

 

 

                if (rxml.Name == "数字")

 

 

                {//读取数字

 

 

                    Console.WriteLine("数字值:" + rxml.ReadElementContentAsDouble()*100);

 

 

                }

 

 

                else if (rxml.Name == "字符串")

 

 

                {//读取字符串

 

 

                    Console.WriteLine("字符串值:" + rxml.ReadElementContentAsString());

 

 

                }

 

 

                Console.WriteLine("====================================================");

 

 

            }

 

 

            rxml.Close();

 

 

            Console.Read();

 

 

        }

 

 

        //读取XML错误时调用的方法

 

 

        static void Error(object sender, ValidationEventArgs e)

 

 

        {

 

 

            Console.WriteLine("########XML格式出错:"+e.Message);

 

 

        }

 

 

    }

 

 

(4)使用XmlWriter类写XML文件

 

 

XmlWriter类可以吧XML数据写入一个流、文件、StringBuilder、TextWriter或另一个XmlWriter对象。与XmlReader一样XmlWriter类以只向前、未缓存的方式进行写入。XmlWriter类的可配置性很高,可以指定是否缩进内容、缩进量、在属性中使用什么引号,以及是否支持名称空间等信息。与XmlReader类一样,这个配置使用XmlWriterSettings对象。

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XmlWriterSettings settings = new XmlWriterSettings();

 

 

            settings.Indent = true;//设置使用缩进

 

 

            settings.NewLineOnAttributes = true;//设置将属性写入新行

 

 

            XmlWriter wxml = XmlWriter.Create(@"..\..\XML\newXML.xml",settings);

 

 

            wxml.WriteStartDocument();//写入XML的申明

 

 

            wxml.WriteStartElement("根节点");//开始写根节点==

 

 

            wxml.WriteStartElement("节点");//开始写节点

 

 

            wxml.WriteAttributeString("姓名", "李志伟");//写属性

 

 

            wxml.WriteAttributeString("年龄", "20");//写属性

 

 

            wxml.WriteString("李志伟lizhiwei");//写节点内容

 

 

            wxml.WriteEndElement();//节点写完

 

 

            wxml.WriteElementString("标题","测试节点!!!ABCD");//直接写无属性节点

 

 

            wxml.WriteEndElement();//根节点写完==

 

 

            wxml.Close();

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

    }

 

 

3.使用XmlDocument、XmlNode实现DOM读写XML

 

 

(1)测试的XML文件(XML.xml)

 

 

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

 

 

<根节点>

 

 

  <节点>元素类容</节点>

 

 

  <数字 属性1="李志伟" 属性2="lizhiwei">123.456</数字>

 

 

  <数字>123456.789</数字>

 

 

  <子节点>

 

 

    <整数>123456</整数>

 

 

    <字符串>李志伟</字符串>

 

 

    <空节点 作用="测试插入节点">

 

 

    </空节点>

 

 

  </子节点>

 

 

</根节点>

 

 

(2)测试查找与插入节点的代码

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XmlDocument xml = new XmlDocument();

 

 

            xml.Load(@"..\..\XML\XML.xml");//加载XML文件

 

 

            //得到一组节点

 

 

            XmlNodeList nodes = xml.GetElementsByTagName("数字");

 

 

            foreach (XmlNode node in nodes)

 

 

            {

 

 

                Console.WriteLine("节点=======" + node.Name + "\t" + node.InnerText);

 

 

                foreach (XmlAttribute a in node.Attributes)

 

 

                {

 

 

                    Console.WriteLine("属性:" + a.Name + "\t" + a.Value);

 

 

                }

 

 

            }

 

 

            //创建要插入的节点

 

 

            XmlElement element = xml.CreateElement("插入节点");//创建节点

 

 

            element.SetAttribute("姓名", "李志伟");//设置属性

 

 

            element.SetAttribute("年龄", "20");//设置属性

 

 

            XmlElement child = xml.CreateElement("插入子节点");//创建节点

 

 

            child.InnerText = "测试插入节点!ABCD";//设置节点内容

 

 

            element.AppendChild(child);

 

 

            //设置插入节点的位置

 

 

            nodes = xml.GetElementsByTagName("空节点");

 

 

            nodes[0].AppendChild(element);//插入节点

 

 

            xml.Save(@"..\..\XML\XML.xml");

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

    }

 

 

注意:在使用XmlDocument的GetElementById方法时,需要使用DTD定义哪些属性是ID类型的属性,否者调用GetElementById时返回null。

 

 

4.使用XPathNavigator类快速查询XML文档元素

 

 

(1)System.Xml.XPath命名空间

 

 

System.Xml.XPath命名空间中包含的类用于定义光标模型,该模型可将 XML 信息项作为 XQuery 1.0 和 XPath 2.0 数据模型的实例进行导航和编辑。

 

 

System.Xml.XPath命名空间重要的类:

 

 

XPathDocument

 

 

提供整个XML文档的视图,只读

 

 

XPathNavigator

 

 

为定位和编辑 XML 数据提供游标模型。

 

 

XPathNodeIterator

 

 

在一组选中的节点上提供迭代器。

 

 

XPathItem

 

 

表示 XQuery 1.0 和 XPath 2.0 数据模型中的项。

 

 

XPathExpression

 

 

提供表示已编译的 XPath 表达式的类型化类。

 

 

XPathException

 

 

提供在处理 XPath 表达式的过程中发生错误时所引发的异常。

 

 

(2)XPathNavigator类介绍

 

 

XPathNavigator类在System.Xml.XPath命名空间中,XPathNavigator类包含移动和选择所需元素的所有方法,分别是MoveXXX()与SelectXXX()方法。使用XPathNavigator类多数情况下是需要查找XML文档元素,而不是修改XML文档。

 

 

使用XPathNavigator类需与System.Xml.XPath命名空间里的其它类一起使用,详细请查看System.Xml.XPath命名空间。

 

 

(3)使用XPathNavigator对象查询XML元素

 

 

测试的XML文件

 

 

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

 

 

<根节点>

 

 

  <节点 节点名="A">

 

 

    <子节点1>AAA子节点1</子节点1>

 

 

    <子节点2>AAA子节点2</子节点2>

 

 

    <子节点3>AAA子节点3</子节点3>

 

 

  </节点>

 

 

  <节点 节点名="B">

 

 

    <子节点1>BBB子节点1</子节点1>

 

 

    <子节点2>BBB子节点2</子节点2>

 

 

    <子节点3>BBB子节点3</子节点3>

 

 

  </节点>

 

 

  <节点 节点名="A">

 

 

    <子节点1>CCC子节点1</子节点1>

 

 

    <子节点2>CCC子节点2</子节点2>

 

 

    <子节点3>CCC子节点3</子节点3>

 

 

  </节点>

 

 

</根节点>

 

 

测试的代码

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XPathDocument xml = new XPathDocument(@"..\..\XML\XML.xml");

 

 

            XPathNavigator nav = xml.CreateNavigator();

 

 

            XPathNodeIterator iter = nav.Select("根节点/节点[@节点名='A']");//查询

 

 

            while (iter.MoveNext())//下一个结果

 

 

            {

 

 

                Console.WriteLine(iter.Current.Name + "\t" + iter.Current.Value);

 

 

                XPathNodeIterator temp =

 

 

iter.Current.SelectDescendants(XPathNodeType.Element,false);//查询

 

 

                while (temp.MoveNext())//下一个结果

 

 

                {

 

 

                    Console.WriteLine(temp.Current.Name + "\t" + temp.Current.Value);

 

 

                }

 

 

            }

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

}

 

 

注意:有关XPath表达式的语法请查询Visual Studio文档!

 

 

(4)使用XPathNavigator对象查询并修改XML元素

 

 

使用XmlDocument对象创建的XPathNavigator对象,可以修改XML文档。上例的XML文档不变,代码如下:

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XmlDocument xml = new XmlDocument();

 

 

            xml.Load(@"..\..\XML\XML.xml");

 

 

            XPathNavigator nav = xml.CreateNavigator();

 

 

            XPathNodeIterator iter = nav.Select("根节点/节点[@节点名='A']");//查询

 

 

            while (iter.MoveNext())

 

 

            {

 

 

                Console.WriteLine(iter.Current.Name + "\t" + iter.Current.Value);

 

 

                XPathNodeIterator temp =

 

 

iter.Current.SelectDescendants(XPathNodeType.Element,false);//查询

 

 

                while (temp.MoveNext())

 

 

                {

 

 

                    Console.WriteLine(temp.Current.Name + "\t" + temp.Current.Value);

 

 

                    temp.Current.InsertBefore("<插入子节点>李志伟</插入子节点>");//插入节点

 

 

                }

 

 

            }

 

 

            xml.Save(@"..\..\XML\XML.xml");

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

}

 

 

5.XSL转换数据格式

 

 

(1)System.Xml.Xsl命名空间

 

 

System.Xml.Xsl命名空间为“可扩展样式表转换”(XSLT) 转换提供支持。它支持“W3C XSL 转换 (XSLT) 1.0 版推荐”(www.w3.org/TR/xslt)。

 

 

System.Xml.Xsl命名空间重要的类:

 

 

XslCompiledTransform

 

 

使用 XSLT 样式表转换 XML 数据。

 

 

XsltArgumentList

 

 

包含数目可变的参数(这些参数是 XSLT 参数,或者是扩展对象)。

 

 

XsltContext

 

 

可扩展样式表转换语言 (XSLT) 处理器的当前执行上下文。 

 

 

XsltSettings 

 

 

指定执行 XSLT 样式表时要支持的 XSLT 功能。

 

 

(2)使用XslCompiledTransform类转换数据格式

 

 

可以使用XslCompiledTransform类把XML文件数据转换成其他格式的文件,本例使用XSLT文件(XSLTFile.xslt)把XML文件(XML.xml)转换成一个HTML文档。

 

 

XSLTFile.xslt文件内容如下:

 

 

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

 

 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 

 

    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

 

 

  <xsl:template match="/">

 

 

    <html>

 

 

      <head><title>李志伟</title></head>

 

 

      <body><table border="1"><xsl:apply-templates/></table></body>

 

 

    </html>

 

 

  </xsl:template>

 

 

  <xsl:template match="根节点">

 

 

    <xsl:apply-templates select="节点"/>

 

 

  </xsl:template>

 

 

  <xsl:template match="节点">

 

 

    <tr>

 

 

      <td><xsl:apply-templates select="子节点1"/></td>

 

 

      <td><xsl:apply-templates select="子节点2"/></td>

 

 

    </tr>

 

 

  </xsl:template>

 

 

</xsl:stylesheet>

 

 

XML.xml文件内容如下:

 

 

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

 

 

<根节点>

 

 

  <节点>

 

 

    <子节点1>第一列01</子节点1>

 

 

    <子节点2>第二列01</子节点2>

 

 

  </节点>

 

 

  <节点>

 

 

    <子节点1>第一列02</子节点1>

 

 

    <子节点2>第二列02</子节点2>

 

 

  </节点>

 

 

</根节点>

 

 

程序代码如下:

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XslCompiledTransform trans = new XslCompiledTransform();

 

 

            trans.Load(@"..\..\XML\XSLTFile.xslt");//加载XSLT文件

 

 

            trans.Transform(@"..\..\XML\XML.xml", @"..\..\XML\HTML.html");//转换HTML文件

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

    }

 

 

注意:XSLT文件的语法可以到http://www.w3school.com.cn/xsl/网站学习!

 

 

(3)使用XsltArgumentList类绑定对象到命名空间

 

 

XSLTFile.xslt文件内容如下,注意修改的部分:

 

 

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

 

 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 

 

    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"

 

 

    xmlns:Test="urn:XslTest">

 

 

  <xsl:template match="/">

 

 

    <html>

 

 

      <head><title>李志伟</title></head>

 

 

      <body><table border="1"><xsl:apply-templates/></table></body>

 

 

    </html>

 

 

  </xsl:template>

 

 

  <xsl:template match="根节点">

 

 

    <xsl:apply-templates select="节点"/>

 

 

  </xsl:template>

 

 

  <xsl:template match="节点">

 

 

    <tr>

 

 

      <td><xsl:apply-templates select="子节点1"/></td>

 

 

      <td><xsl:apply-templates select="子节点2"/></td>

 

 

      <td><xsl:value-of select="Test:ShowText()"/></td>

 

 

    </tr>

 

 

  </xsl:template>

 

 

</xsl:stylesheet>

 

 

XML文件不变,程序代码如下:

 

 

    class Test

 

 

    {

 

 

        private int Count = 0;

 

 

        public string ShowText()

 

 

        {

 

 

            return "李志伟,行数:" + (Count++);

 

 

        }

 

 

    }

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XPathDocument xml = new XPathDocument(@"..\..\XML\XML.xml");

 

 

            XslCompiledTransform trans = new XslCompiledTransform();

 

 

            trans.Load(@"..\..\XML\XSLTFile.xslt");//加载XSLT文件

 

 

            XmlWriter xw = new XmlTextWriter(@"..\..\XML\HTML.html", Encoding.UTF8);

 

 

            XsltArgumentList arg = new XsltArgumentList();

 

 

            Test test = new Test();

 

 

            arg.AddExtensionObject("urn:XslTest", test);//绑定对象参数

 

 

            XPathNavigator nav = xml.CreateNavigator();

 

 

            trans.Transform(nav, arg, xw);//生成文件

 

 

            xw.Close();

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

    }

 

 

(4)调试XSLT

 

 

使用VS 2010可以调试XSLT转换XML文件的过程,可以在VS 2010 XSLT文件编辑器中下断点。也可以使用:XslCompiledTransform trans = new XslCompiledTransform(true)的方式,在运行时调试。

 

 

注意:本节只是介绍使用XSLT转换数据格式的基本使用,不做深入研究,更详细信息请查看本人的其它相关文档。

 

 

6.在XML中序列化对象

 

 

(1).NET对象序列化的方式介绍

 

 

二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。

 

 

XML序列化:对象序列化之后的结果是XML形式的,通过XmlSerializer 类来实现的,这个类位于System.Xml.Serialization命名空间下。XML序列化不能序列化私有数据。

 

 

SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的。

 

 

(2)使用XmlSerializer序列化与反序列化

 

 

    public class Test//被序列化对象

 

 

    {

 

 

        [XmlAttribute]

 

 

        public string ID { set; get; }

 

 

        [XmlElement]

 

 

        public string Name { set; get; }

 

 

        [XmlElement]

 

 

        public int Age { set; get; }

 

 

        [XmlElement]

 

 

        public string Sex { set; get; }

 

 

        [XmlElement]

 

 

        public List<string> Interest { set; get; }

 

 

        public override string ToString()

 

 

        {

 

 

            return "ID:" + ID + ",Name" + Name + ",Age" + Age + ",Sex" + Sex;

 

 

        }

 

 

    }

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            //创建对象

 

 

            Test test = new Test() { ID = "01", Name = "李志伟", Age = 20, Sex = "男" };

 

 

            test.Interest = new List<string>();

 

 

            test.Interest.Add("看电影");

 

 

            test.Interest.Add("听歌");

 

 

            test.Interest.Add("看书");

 

 

            //序列化

 

 

            XmlTextWriter xmlw = new XmlTextWriter(@"..\..\XML\XML.xml", Encoding.UTF8);

 

 

            XmlSerializer xmlser = new XmlSerializer(typeof(Test));

 

 

            xmlser.Serialize(xmlw, test);//序列化

 

 

            xmlw.Close();//关闭文件

 

 

            Console.WriteLine("序列化成功,请查看XML文件!");

 

 

            Console.ReadLine();

 

 

            //反序列化

 

 

            XmlTextReader xmlr = new XmlTextReader(@"..\..\XML\XML.xml");

 

 

            Test temp = (Test)xmlser.Deserialize(xmlr);//反序列化

 

 

            xmlr.Close();

 

 

            Console.WriteLine("反序列化结果:" + temp);

 

 

            Console.Read();

 

 

        }

 

 

}

 

 

注意:本节只是介绍对象序列化成XML的基本方式,不做深入研究,更详细信息请查看本人的其它相关文档。

 

 

7.使用LINQ查询XML文档

 

 

(1)System.Xml.Linq命名空间

 

 

包含LINQ to XML的类。LINQ to XML是内存中的XML编程接口,使您可以轻松有效地修改XML文档。使用LINQ to XML可以进行以下操作:从文件或流加载XML;将XML序列化为文件或流;使用功能构造从头创建XML树;使用LINQ查询来查询XML树;操作内存中的XML树;使用XSD验证XML树。组合使用这些功能将XML树从一种形状转换为另一种形状。

 

 

System.Xml.Linq命名空间较重要的类:

 

 

XDocument

 

 

表示 XML 文档。

 

 

XComment

 

 

表示一个 XML 注释。

 

 

XNamespace

 

 

表示一个 XML 命名空间。无法继承此类。

 

 

XNode

 

 

表示 XML 树中节点的抽象概念(元素、注释、文档类型、处理指令或文本节点)。

 

 

XElement

 

 

表示一个 XML 元素。

 

 

XAttribute

 

 

表示一个 XML 属性。

 

 

XName

 

 

表示 XML 元素或属性的名称。

 

 

XText

 

 

表示一个文本节点。

 

 

(2)System.Xml.Linq命名空间类的基本使用

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XDocument xml = XDocument.Load(@"..\..\XML\XML.xml"); ;

 

 

            Console.WriteLine(xml.Root.Name);//根节点名

 

 

            Console.WriteLine(xml.Root.LastAttribute);//最后一个属性

 

 

            XNamespace ns = "http://www.cnblogs.com/LiZhiW/";

 

 

            XElement root = new XElement(ns + "根节点",

 

 

                new XElement("节点", "节点内容"),

 

 

                new XElement("节点",

 

 

                    new XElement("子节点", "子节点内容AAA"),

 

 

                    new XElement("子节点", "子节点内容BBB")));

 

 

            XComment com = new XComment("标准XML注释");//XML注释

 

 

            root.Add(com);//加入XML注释

 

 

            XAttribute atu = new XAttribute("作者","李志伟");//XML属性

 

 

            root.Add(atu);//加入XML属性

 

 

            root.Save(@"..\..\XML\XML.xml");

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

    }

 

 

(3)查询静态的XML文档

 

 

使用的XML文件内容:

 

 

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

 

 

<根节点>

 

 

  <节点>

 

 

    <子节点1>第一列01</子节点1>

 

 

    <子节点2>第二列01</子节点2>

 

 

  </节点>

 

 

  <节点>

 

 

    <子节点1>第一列02</子节点1>

 

 

    <子节点2>第二列02</子节点2>

 

 

  </节点>

 

 

</根节点>

 

 

程序代码如下:

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XDocument xml = XDocument.Load(@"..\..\XML\XML.xml"); ;

 

 

            var query = from element in xml.Descendants("子节点2") select element.Value;

 

 

            foreach (string s in query)

 

 

            {

 

 

                Console.WriteLine(s);

 

 

            }

 

 

            Console.Read();

 

 

        }

 

 

    }

 

 

(4)查询动态的XML

 

 

    class Program

 

 

    {

 

 

        static void Main(string[] args)

 

 

        {

 

 

            XDocument xml = XDocument.Load(@"http://geekswithblogs.net/evjen/Rss.aspx");

 

 

            Console.WriteLine("已加载动态的XML");

 

 

            var query = from element in xml.Descendants("title") select element.Value;

 

 

            foreach (string s in query)

 

 

            {

 

 

                Console.WriteLine(s);

 

 

            }

 

 

            Console.WriteLine("OK!");

 

 

            Console.Read();

 

 

        }

 

 

}

 

 

注意:本节只是介绍Linq to Xml的基本使用,不做深入研究,更详细信息请查看本人的其它相关文档。

 

 

 

网友评论

登录后评论
0/500
评论
杰克.陈
+ 关注