C#中基于流的XML文件操作笔记
System.Xml.XmlReader和System.Xml.XmlWriters是两个抽象类,XmlReader提供了对于XML数据的快速,非缓存,只进模式的读取器,XmlWriter表示一个编写器,该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件。
XmlReader与SAX读取器类似,不过前者是提取模式(只进只读的游标),后者是推送模式(将事件推送到应用程序)。
XmlReader的优点是:
1.简化状态管理
2.可以有多个输入流
3.提取模式可以作为推送模式的基础,反之不行。
4.提供一个可以将字符串直接写入缓冲区,避免多余字节的的复制。
5.有选择的处理XML流,可以预先设置处理XML流的方式。
下面的代码代码逻辑简单不会出现异常所以没有加入异常处理,只是作为测试使用。
//ReadXml.cs
//XmlReader示例
usingSystem;
usingSystem.Xml;
classTest
{
publicstaticvoidMain(string[]args)
{
stringpath=@"G:\资料\C#面向对象编程\C#面向对象编程\CSharp\Chapter17\books.xml";
XmlReaderreader=null;
try
{
//创建XmlReaderSettings对象
XmlReaderSettingssettings=newXmlReaderSettings();
//设置XmlReaderSettings对象的属性
settings.ProhibitDtd=false;
//使用XmlReaderSettings对象来创建XmlReader对象
reader=XmlReader.Create(path,settings);
ReadXml(reader);
reader.Close();
Console.ReadKey();
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
}
finally
{
if(reader!=null)
reader.Close();
}
}
privatestaticvoidReadXml(XmlReaderreader)
{
try
{
//解析文件,并显示每一个节点
while(reader.Read())
{
switch(reader.NodeType)
{
caseXmlNodeType.Element:
if(reader.IsEmptyElement)//空元素?
{
Console.WriteLine("<{0}/>",reader.Name);
}
else
{
Console.Write("<{0}",reader.Name);
if(reader.HasAttributes)//属性?
{
while(reader.MoveToNextAttribute())
{
Console.Write("{0}=\"{1}\"",reader.Name,reader.Value);
}
}
Console.WriteLine(">",reader.Name);
}
break;
caseXmlNodeType.Text:
Console.WriteLine(reader.Value);
break;
caseXmlNodeType.CDATA:
Console.WriteLine("<![CDATA[{0}]]>",reader.Value);
break;
caseXmlNodeType.ProcessingInstruction:
Console.WriteLine("<?{0}{1}?>",reader.Name,reader.Value);
break;
caseXmlNodeType.Comment:
Console.WriteLine("<!--{0}-->",reader.Value);
break;
caseXmlNodeType.XmlDeclaration:
Console.WriteLine("<?xmlversion='1.0'?>");
break;
caseXmlNodeType.Document:
break;
caseXmlNodeType.DocumentType:
Console.WriteLine("<!DOCTYPE{0}[{1}]>",reader.Name,reader.Value);
break;
caseXmlNodeType.EntityReference:
Console.WriteLine(reader.Name);
break;
caseXmlNodeType.EndElement:
Console.WriteLine("</{0}>",reader.Name);
break;
}
}
}
catch(XmlExceptionex)
{
Console.WriteLine(ex.Message);
}
}
}
XmlWriters该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件,优点基本和前者一样。
注意:使用XmlReader,在调用Close方法前,不会读取元素和特性。
XMLWriter
usingSystem.Xml;
namespaceConsoleApplication1
{
classProgram
{
staticvoidMain(string[]args)
{
stringpath=@"C:\Users\dell\Desktop\test.xml";
XmlWriterwriter=null;
XmlWriterSettingssettings=newXmlWriterSettings();
settings.Indent=true;
settings.IndentChars=("");
writer=XmlWriter.Create(path,settings);
WriteXml(writer);
writer.Close();
}
privatestaticvoidWriteXml(XmlWriterwriter)
{
writer.WriteStartElement("books");
WriteChildNode(writer,"红楼梦","曹雪芹","25");
WriteChildNode(writer,"三国演义","罗贯中","20");
WriteChildNode(writer,"水浒传","施耐庵","18");
WriteChildNode(writer,"聊斋志异","蒲松龄","16");
writer.WriteEndElement();
}
privatestaticvoidWriteChildNode(XmlWriterwriter,stringtitle,stringauthor,stringprice)
{
writer.WriteStartElement("book");
writer.WriteStartElement("title");
writer.WriteValue(title);
writer.WriteEndElement();
writer.WriteStartElement("author");
writer.WriteValue(author);
writer.WriteEndElement();
writer.WriteStartElement("price");
writer.WriteValue(price);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
}
基本用法很简单,就是输出前后开关标签,主要使用这三个方法WriteStartElement()writer.WriteValue()WriteEndElement()
注意: XmlWriter方法输出XML时,在调用Close方法前,不会写入元素和特性。