C#操作XML

原文 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的基本使用,不做深入研究,更详细信息请查看本人的其它相关文档。

 

 

 

时间: 2024-10-18 15:01:38

C#操作XML的相关文章

JDOM操作XML文件(法老修正版)

dom|xml 原文:JDOM操作XML文件地址:http://www.jspcn.net/htmlnews/200120272.html---------------------------------------------------------------------------    这篇文章讲的不错~把JDOM的基本操作实例化了,不过由于当时的作者用的JDOM版本还比较陈旧,所以部分代码会编译出错!支持中文也不好!所以,法老在原作者的基础上对程序做了修改!休正了编译出错以及中文乱码的

一个通过DataSet操作XML的类(原创)

xml|原创 这段时间写的项目每次都要用到XML保存一些配置,而每次操作XML都觉得挺麻烦,没有数据库那么顺手.后来发现用DataSet操作XML很方便,而且灵活性比较好,于是写了一个操作XML的类,用来应付一般的XML操作(源码下载附件). 1 基本思路 其实用DataSet操作XML,归根到底就是对DataSet里的表格,行,列等进行操作,然后用DataSet里的东西重新写到XML中,从而实现编辑XML的目的.如果再配合上.xsd文件的话,那效果更佳. 2 程序详解 (1) XML文件内容

ASP通过XMLDom在服务器端操作XML文件的主要方法和实现。

dom|xml|服务器 对于小数据量,xml文件在检索更新上于ACCESS有很多优势. 我曾经测试过不用数据库,把网站的会员信息,商品数据信息,交易信息,网站定制信息全部存放在三个xml文件中,运行结果十分正常,感觉上比数据库快多了,不过没有作测试,不能确定.(http://stone.yesku.net) 下面说一下创建,查询,修改等对xml操作的主要方法 '创建DOM对象set objDom=server.CreateObject("MicroSoft.XMLDom") '取得xm

用javascript操作xml

javascript|xml <script language="JavaScript"><!--var doc = new ActiveXObject("Msxml2.DOMDocument"); //ie5.5+,CreateObject("Microsoft.XMLDOM") //加载文档//doc.load("b.xml"); //创建文件头var p = doc.createProcessingIn

利用Visual Basic操作XML数据

visual|xml|数据 什么是XML 扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用. XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引.排序.查找.相关一致性等,XML仅仅是展示数据.事实上XML与其他数据表现形式最大的不同是:他极其简单.这是一个看上去有点琐细的优点,但正是

利用VisualBasic操作XML数据

visual|xml|数据 什么是XML 扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用. XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引.排序.查找.相关一致性等,XML仅仅是展示数据.事实上XML与其他数据表现形式最大的不同是:他极其简单.这是一个看上去有点琐细的优点,但正是

ASP通过XMLDom在服务器端操作XML文件的主要方法和实现

dom|xml|服务器 对于小数据量,xml文件在检索更新上于ACCESS有很多优势. 我曾经测试过不用数据库,把网站的会员信息,商品数据信息,交易信息,网站定制信息全部存放在三个xml文件中,运行结果十分正常,感觉上比数据库快多了,不过没有作测试,不能确定. 下面说一下创建,查询,修改等对xml操作的主要方法 '创建DOM对象set objDom=server.CreateObject("MicroSoft.XMLDom") '取得xml数据'方法1 取得xml文件的xml数据  o

用FSO操作xml

fso|xml 试了一下,xmlDoc.save()行不同,就试着用fso做了出来.整理一下,供大家discuss. 由于用js操作本地xml文件之后save时会permission denied,所以据我所知就只能通过FSO来做.而用FSO,基本上就与文件是否是xml无关. xml文件: <root>  <parent>    <child1>one</child1>    <child2>one</child2>  </pa

PHPl使用DOM XML操作XML[总结]

1.前言   XML树状层次结构鲜明,非常适合作为配置文件.PHP中可以使用DOM XML来操作XML.本文总结一下PHP使用DOM XML创建.添加节点.查询XML文件.   2.使用DOM XML   XML中节点分为元素和文本,DOMDocument类型是文档类型,提供了操作元素和文本的成员函数和属性.   DOMDocument类如下:   复制代码 DOMDocument extends DOMNode { /* Properties */ readonly public string

使用jdom操作xml数据,生成含Jtree的applet

dom|xml|数据 转自:http://www.softhouse.com.cn/html/200410/2004102517145700001335.html 使用jdom操作xml数据,生成含Jtree的applet    在我们工作中,常常会碰到树形组件的生成问题,如果你在开发web application,纯粹使用javascript来生成树形组件是非常繁琐的,而且交互性也不不太好.所以许多产品使applet来实现树形组件的功能.比如说,weblogic,jboss等产品的consol