.net读写xml文档详解
一 .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);
}