XML起步
-研究System.Xml命名空间对XML文件操作的支持
By Alva Chien
File Version: 1.0
Released: 2007.8.30
FCL提供了System.Xml这个命名空间来支持对XML文件的操作,一开始接触这个namespace会发现很多Class,可能会无所适从,不知从何开始。事实上,对于简单的XML读写操作,可以使用以下两种方法:
1. 使用XmlTextReader和XmlTextWriter类
通常这种方法主要用于操作很简单的XML文件,一般这些XML文件不是很强调数据内容的格式。比如,笔者认为简单的替换传统的ini文件的XML文件就可以认为是简单的。当然,简单与否是相对的概念。
一个完整的读取文件的例子如下:
XmlTextReader reader = null;
try
{
// Load the reader with the data file and ignore all white space nodes.
reader = new XmlTextReader(“Test.xml”);
reader.WhitespaceHandling = WhitespaceHandling.None;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
break;
case XmlNodeType.Attribute:
break;
case XmlNodeType.Text:
//Console.Write(reader.Value);
break;
case XmlNodeType.CDATA:
//Console.Write("<![CDATA[{0}]]>", reader.Value);
break;
case XmlNodeType.ProcessingInstruction:
//Console.Write("<?{0} {1}?>", reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
//Console.Write("<!--{0}-->", reader.Value);
break;
case XmlNodeType.XmlDeclaration:
//Console.Write("<?xml version='1.0'?>");
break;
case XmlNodeType.Document:
case XmlNodeType.DocumentType:
//Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
break;
case XmlNodeType.EntityReference:
//Console.Write(reader.Name);
break;
case XmlNodeType.EndElement:
//Console.Write("</{0}>", reader.Name);
break;
default:
break;
}
}
}
finally
{
if (reader != null)
reader.Close();
}
一个完整的写入文件的例子如下:
XmlTextWriter writer = new XmlTextWriter(“Test.xml”, Encoding.Unicode);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteComment("This is test file");
writer.WriteStartElement(“Root”);
writer.WriteElementString(“TEST”, “TEST1”);
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
2. 使用XmlDocument和XmlReader/XmlWriter类,以及很多的辅助类
理论来说,FCL提供了两种model来解析Xml文件,其中一种称为DOM (Document Object Model),FCL使用了XmlDocument以及周围的辅助类来实现了这种方式, 另外一种称为XPath data model,FCL通过XPathDocument以及辅助类实现了这种方式。本文中只涉及第一种方式:
一个完整的写入文件的例子:
XmlDocument doc = new XmlDocument();
// Create the root
doc.LoadXml("<Root />");
// Create declarion first
XmlDeclaration xmldecl;
xmldecl = doc.CreateXmlDeclaration("1.0", "utf-16", null);
doc.InsertBefore(xmldecl, doc.DocumentElement);
//Create a comment.
XmlComment newComment = doc.CreateComment("Sample XML document");
doc.InsertBefore(newComment, doc.DocumentElement);
//Create a new node.
XmlElement elem = doc.CreateElement("DataFolder");
elem.InnerText = "workFolder";
//Add the node to the document.
doc.DocumentElement.AppendChild(elem);
// Create a document fragment.
//XmlDocumentFragment docFrag = doc.CreateDocumentFragment();
//Set the contents of the document fragment.
//docFrag.InnerXml = "<item>widget</item>";
//doc.DocumentElement.AppendChild(docFrag);
// Create a new node and add it to the document.
//XmlNode elem = doc.CreateNode(XmlNodeType.Element, "price", null);
//elem.InnerText = "19.95";
//doc.DocumentElement.AppendChild(elem);
doc.Save(Console.Out);
一个完整的读取文件的例子:
XmlDocument doc = new XmlDocument();
//Load the the document with the last book node.
XmlTextReader reader = new XmlTextReader(“Test.xml”);
reader.WhitespaceHandling = WhitespaceHandling.None;
reader.MoveToContent();
reader.Read();
doc.Load(reader);
这个例子中,doc已经拥有了以XMLNode为节点的树,如何遍历这个树?那是《数据结构》中的命题了,当然无外乎深度优先和广度优先了….