试试看这个:
读出:
XmlDocument doc = new XmlDocument();
doc.Load( fileName );
XmlNodeList nodes = doc.GetElementsByTagName( tagName );
String result = nodes.Item(tagNumber).InnerText;
// start:0
写入:
XmlTextWriter writer = new XmlTextWriter (fileName, null);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement( tagName );
writer.WriteElementString( tagName, Value )// Value 是上面所取得的值.
/..../
/中间可以再添加一些tag/
/*
writer.WriteStartDocument();
......
writer.WriteEndElement();
*/
writer.WriteEndElemnt();
writer.Flush();
writer.Close();
读出:
XmlDocument doc = new XmlDocument();
doc.Load( fileName );
XmlNodeList nodes = doc.GetElementsByTagName( tagName );
String result = nodes.Item(tagNumber).InnerText;
// start:0
写入:
XmlTextWriter writer = new XmlTextWriter (fileName, null);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement( tagName );
writer.WriteElementString( tagName, Value )// Value 是上面所取得的值.
/..../
/中间可以再添加一些tag/
/*
writer.WriteStartDocument();
......
writer.WriteEndElement();
*/
writer.WriteEndElemnt();
writer.Flush();
writer.Close();
<? xml version="1.0" encoding="gb2132" ?>
<recode>
<person>
<name>jay</name>
<tel country="001" city="01">123</tel>
</person>
<person>
<name>ken</name>
<tel country="" city="02">456</tel>
</person>
</recode>.NET模拟实现SAXSAX(Simple Application for XML)是XML的另外一种程序接口,与DOM相比,有自己的优势和劣势:
·当文档很大的时候,使用DOM会占用很大的空间,比如,100K的文档要占用1M的空间。而SAX则几乎不需要额外的空间。在处理较大的文档时,SAX体现了它最大的优势。
·不必解析整个文档, 在只需小部分内容的时候可以节省系统资源。
·不能做随机访问,只能向后地读取文档信息。
·大文档读取速度不如DOM。
·对于复杂的搜索不能胜任。
具体操作using System;
using System.Xml;
using System.Text;
using System.IO;
namespace xml_sax
{
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
ReadXml();//读取文档
WriteXml();//写文档
//要添加的数据:
Data data = new Data ();
data.Name = "Bill";
data.Tel = "678";
data.City = "003";
AddXml(data);//添加一个数据
Console.WriteLine ("the 2nd read:");
ReadXml();
}
static void GetAttr(XmlReader reader)//读取一个节点及它的属性
{
string name;
name = reader.Name ;//当前节点的名称
for(int i=0;i<reader.AttributeCount /*属性的个数/*;i++)
{
reader.MoveToNextAttribute();//移动到下一个属性
Console.WriteLine("attr:{0}:{1}",
reader.Name,reader.Value/*当前节点的值*/ );
}
reader.Read ();//读取下一个节点
Console.WriteLine("{0}:{1}",name ,reader.Value);
}
static void ReadXml()
{
//建立读文档对象:
XmlTextReader reader = new XmlTextReader ("d:\\person.xml");
while ( reader.Read())//逐个读取节点
{
if(reader.NodeType ==XmlNodeType.Element /*指定节点类型为元素*/)
//可以读所有的节点,包括根结点recode
{
switch(reader.Name)
{
case "name":
GetAttr(reader);//读取节点内容
break;
case "tel" :
GetAttr(reader);
break;
}
}
if (reader.NodeType == XmlNodeType.EndElement//元素尾类型
&& reader.Name == "person")
//到此读完一条数据
{
Console.WriteLine ("_________________________________");
}
}
reader.Close();//关闭文档
}
static void WriteXml()
//此过程从person.xml读数据,写到person1.xml中
{
//建立读写对象:
XmlTextReader reader = new XmlTextReader("d:\\person.xml");
XmlTextWriter writer = new XmlTextWriter("d:\\person1.xml",
Encoding.UTF8);
writer.Formatting = Formatting.Indented ;//设置写入的格式为锯齿型
writer.WriteStartDocument (); //写入文档第一行的XML说明
while(reader.Read ())
{
if(reader.NodeType == XmlNodeType.Element )
{
writer.WriteStartElement (reader.Name);//如:<name>
//写入节点的所有属性:
writer.WriteAttributes (reader,true);
}
else if (reader.NodeType == XmlNodeType.EndElement )
{
writer.WriteEndElement ();//如;</name>
}
else if(reader.NodeType == XmlNodeType.Text /*文本型*/ )
{
writer.WriteString (reader.Value);//写入值
}
}
reader.Close ();
writer.Close ();
}
static void AddXml(Data data)
{
/*添加的方法和C语言中顺序文件的删除方法很相似,
是将原文件中的数据逐一写到临时文件中,然后
在适当的位置写入新数据 */
XmlTextReader reader = new XmlTextReader("d:\\person.xml");
XmlTextWriter writer = new XmlTextWriter("d:\\person1.xml",
Encoding.UTF8);
writer.Formatting = Formatting.Indented ;
writer.WriteStartDocument ();
while(reader.Read ())
{
switch(reader.NodeType )
{
case XmlNodeType.Element:
writer.WriteStartElement (reader.Name );
writer.WriteAttributes (reader,true);
break;
case XmlNodeType.EndElement :
if (reader.Name == "recode")
在文档的末尾加入数据:
{
writer.WriteStartElement ("person");
//写入一个元素:
writer.WriteElementString("name",data.Name);
writer.WriteStartElement("tel");
//写入一个属性
writer.WriteAttributeString
("country",data.Country);
writer.WriteAttributeString("city",data.City);
writer.WriteString (data.Tel);
writer.WriteEndElement();
writer.WriteEndElement();
}
writer.WriteEndElement ();
break;
case XmlNodeType.Text :
writer.WriteString (reader.Value );
break;
}
}
reader.Close ();
writer.Close ();
//用原文件名替换临时文件名
File.Copy ("d:\\person1.xml","d:\\person.xml",true);
File.Delete ("d:\\person1.xml");//删除临时文件 }
}
class Data//数据类
{
public Data()
{
}
public string Name = "",
Tel = "",
Country = "",
City = "";
}
}
输出结果:name:jay
attr:country:001
attr:city:01
tel:123
_____________________________
name:ken
attr:country:
attr:city:02
tel:456
_____________________________
the 2nd read:
name:jay
attr:country:001
attr:city:01
tel:123
_____________________________
name:ken
attr:country:
attr:city:02
tel:456
_____________________________
name:Bill
attr:country:003
attr:city:03
tel:678
_____________________________person.xml:<?xml version="1.0" encoding="utf-8"?>
<recode>
<person>
<name>jay</name>
<tel country="001" city="01">123</tel>
</person>
<person>
<name>ken</name>
<tel country="" city="02">456</tel>
</person>
<person>
<name>Bill</name>
<tel country="" city="003">678</tel>
</person>
</recode>
我在asp.net的codebehind中,读一个xml文件(该文件是在excel中新建一个空白工作簿后,另存为.xml文件的),然后读取该文件,根据自己的需要生成相应的.xslt文件,在然后,我将从数据库中取出的dataset写入另一个xml文件,最后我在excel中根据.xslt样式打开dataset生成的xml文件的时候,总是报错:无法实现当前编码到指定编码的转换。但是,我如果不再.net环境中,直接手工新建、粘贴一个跟程序中生成的.xslt文件内容一样的.xslt文件,就不会出现上面的错误。在.net中写的xslt文件跟环境外生成的文件有什么区别呢?百思不得其解。恳请个位高手指教。问题解决,分数倾囊奉上。