欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net读写xml文档详解

程序员文章站 2024-02-25 22:05:33
一  .net框架中与xml有关的命名空间 system.xml包含了一些和xml文档的读写操作相关的类,它们分别是:xmlreader、xmltextread...

一  .net框架中与xml有关的命名空间

system.xml
包含了一些和xml文档的读写操作相关的类,它们分别是:xmlreader、xmltextreader、xmlvalidatingreader、xmlnodereader、xmlwriter、xmltextwriter 以及 xmlnode(它的子类包括:xmldocument、xmldatadocument、xmldocumentfragment)等类。

system.xml.schema
包含了和xml模式相关的类,这些类包括xmlschema、xmlschemaall、xmlschemaxpath以及xmlschematype等类。

system.xml.serialization
包含了和xml文档的序列化和反序列化操作相关的类。
序列化:将xml格式的数据转化为流格式的数据,并能在网络中传输;
反序列化:完成相反的操作,即将流格式的数据还原成xml格式的数据。

system.xml.xpath
包含了xpathdocument、xpathexression、xpathnavigator以及xpathnodeiterator等类,这些类能完成xml文档的导航功能。
(在xpathdocument类的协助下,xpathnavigator类能完成快速的xml文档导航功能,该类为程序员提供了许多move方法以完成导航功能。)

system.xml.xsl
完成xslt的转换功能。

二  写xml文档的方法

用xmlwriter类实现写操作,该类包含了写xml文档所需的方法和属性,它是xmltextwriter类和xmlnodewriter类的基类。

写操作的有些方法是成对出现的,比如你要写入一个元素,首先调用writestartelement方法—>写入实际内容—>调用writeendelement方法结束。

下面通过其子类 xmltextwriter 来说明如何写xml文档。

xmltextwriter textwriter = new xmltextwriter("c:\\myxmfile.xml", null);

在创建完对象后,我们调用writerstartdocument方法开始写xml文档;
在完成写工作后,就调用writeenddocument结束写过程,并调用close方法将它关闭。

在写的过程中,我们可以:
调用writecomment方法来添加说明;
通过调用writestring方法来添加一个字符串;
通过调用writestartelement和writeendelement方法对来添加一个元素;
通过调用writestartattribute和writeendattribute方法对来添加一个属性;
通过调用writenode方法来添加整的一个节点;
其它的写的方法还包括writeprocessinginstruction和writedoctype等等。

下面的示例介绍如何具体运用这些方法来完成xml文档的写工作。

复制代码 代码如下:

using system;
using system.xml; 

namespace writexml
{
 class class1
 {
  static void main( string[] args )
  {
   try
   {
    // 创建xmltextwriter类的实例对象
    xmltextwriter textwriter = new xmltextwriter("c:\\w3sky.xml", null);
    textwriter.formatting = formatting.indented;

    // 开始写过程,调用writestartdocument方法
    textwriter.writestartdocument(); 

    // 写入说明
    textwriter.writecomment("first comment xmltextwriter sample example");
    textwriter.writecomment("w3sky.xml in root dir");  

    //创建一个节点
    textwriter.writestartelement("administrator");
    textwriter.writeelementstring("name", "formble");
    textwriter.writeelementstring("site", "w3sky.com");
    textwriter.writeendelement();

    // 写文档结束,调用writeenddocument方法
    textwriter.writeenddocument();

    // 关闭textwriter
    textwriter.close();
   }
   catch(system.exception e)
   {
    console.writeline(e.tostring());
   }
  }

 }
}

三  读xml文档的方法

用xmltextreader类的对象来读取该xml文档。在创建新对象的构造函数中指明xml文件的位置即可。

xmltextreader textreader = new xmltextreader("c:\\books.xml");

xmltextreader 类中的属性 nodetype 可以知道其节点的节点类型。通过与枚举类型 xmlnodetype 中的元素的比较,可以获取相应节点的节点类型并对其完成相关的操作。

枚举类型 xmlnodetype 中包含了诸如xmldeclaration、attribute、cdata、element、comment、document、documenttype、entity、processinstruction以及whitespace等xml项的类型。

下面的示例是以读取"books.xml"文件创建对象,通过该xml对象的name、baseuri、depth、linenumber等属性来获取相关信息,并显示在控制台中。(运用vs.net开发工具附带的"books.xml"文件来作为示例)

复制代码 代码如下:

using system;
using system.xml; 

namespace readxml
{
    class class1
    {
        static void main( string[] args )
        {
            // 创建一个xmltextreader类的对象并调用read方法来读取xml文件
            xmltextreader textreader  = new xmltextreader("c:\\books.xml");
            textreader.read();
            // 节点非空则执行循环体
            while ( textreader.read() )
            {
                // 读取第一个元素
                textreader.movetoelement();
                console.writeline("xmltextreader properties test");
                console.writeline("==================="); 

                // 读取该元素的属性并显示在控制台中
                console.writeline("name:" + textreader.name);
                console.writeline("base uri:" + textreader.baseuri);
                console.writeline("local name:" + textreader.localname);
                console.writeline("attribute count:" + textreader.attributecount.tostring());
                console.writeline("depth:" + textreader.depth.tostring());
                console.writeline("line number:" + textreader.linenumber.tostring());
                console.writeline("node type:" + textreader.nodetype.tostring());
                console.writeline("attribute count:" + textreader.value.tostring());
            }
        }
    }
}

四  运用xmldocument类

xmldocument类代表了xml文档,它能完成与整个xml文档相关的各类操作,同时和其相关的xmldatadocument类也是非常重要的,值得深入研究。 该类包含了load、loadxml以及save等重要的方法。

load方法: 可以从一个字符串指定的xml文件或是一个流对象、一个textreader对象、一个xmlreader对象导入xml数据。
loadxml方法: 则完成从一个特定的xml文件导入xml数据的功能。
save方法: 则将xml数据保存到一个xml文件中或是一个流对象、一个textwriter对象、一个xmlwriter对象中。

下面的示例中,用到了xmldocument类对象的loadxml方法,它从一个xml文档段中读取xml数据并调用其save方法将数据保存在一个文件中。

复制代码 代码如下:

// 创建一个xmldocument类的对象
xmldocument doc = new xmldocument();
doc.loadxml(("<student type='regular' section='b'><name>tommy lex</name></student>"));

// 保存到文件中
doc.save("c:\\student.xml");

// 还可以通过改变save方法中参数,将xml数据显示在控制台中,方法如下:
doc.save(console.out);

下面的示例中,用到了一个xmltextreader对象,通过它读取"books.xml"文件中的xml数据。然后创建一个xmldocument对象并载入xmltextreader对象,这样xml数据就被读到xmldocument对象中了。最后,通过该对象的save方法将xml数据显示在控制台中。

xmldocument doc = new xmldocument();
// 创建一个xmltextreader对象,读取xml数据
xmltextreader reader = new xmltextreader("c:\\books.xml");
reader.read();

// 载入xmltextreader类的对象
doc.load(reader);
// 将xml数据显示在控制台中
doc.save(console.out);

xml文件

复制代码 代码如下:

<?xml version='1.0'?>
<!-- this file represents a fragment of a book store inventory database -->
<bookstore>
  <book genre="autobiography" publicationdate="1981" isbn="1-861003-11-0">
    <title>the autobiography of benjamin franklin</title>
    <author>
      <first-name>benjamin</first-name>
      <last-name>franklin</last-name>
    </author>
    <price>8.99</price>
  </book>
  <book genre="novel" publicationdate="1967" isbn="0-201-63361-2">
    <title>the confidence man</title>
    <author>
      <first-name>herman</first-name>
      <last-name>melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy" publicationdate="1991" isbn="1-861001-57-6">
    <title>the gorgias</title>
    <author>
      <first-name>sidas</first-name>
      <last-name>plato</last-name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>

另外一个.net操作xml文件示例

复制代码 代码如下:

//设置配置文件物理路径
    public string xmlpath = "/manage/spider/config.xml";
    protected void page_load(object sender, eventargs e)
    {
        if (!ispostback)
        {
            //设置程序物理路径+文件物理路径
            string path = request.physicalapplicationpath + xmlpath;
            //获取xml元素对象
            xelement config = xelement.load(path);
            if (config != null)
            {
                //获得节点子元素
                xelement eleamazondetailurl = config.element("amazondetailurl");
                xelement eleamazonlisturl = config.element("amazonlisturl");
                xelement elehz = config.element("hz");
                xelement elecount = config.element("count");
                //在页面上呈现取到的数据
                if (eleamazondetailurl != null)
                    textbox_amazondetailurl.text = eleamazondetailurl.value;
                if (eleamazonlisturl != null)
                    textbox_amazonlisturl.text = eleamazonlisturl.value;
                if (elehz != null)
                    textbox_hz.text = elehz.value;
                if (elecount != null)
                    textbox_count.text = elecount.value;
            }
            else
                response.write("");

        }
    }
    protected void btn_save_click(object sender, eventargs e)
    {
        //设置xml文件路径
        string path = request.physicalapplicationpath + xmlpath;
        //设置节点的名称和内容
        xelement root = new xelement("settings",
             new xelement("amazondetailurl", textbox_amazondetailurl.text.trim()),
             new xelement("amazonlisturl", textbox_amazonlisturl.text.trim()),
             new xelement("hz", textbox_hz.text.trim()),
             new xelement("count", textbox_count.text.trim())
                 );
        //将元素序列化到指定路径的xml文件当中
        root.save(path);
     }