内存中的 XML 处理
基于流的 XML 处理提供了最小的负载,但也只提供了最小的灵活性。在很多 XML 处理场景里,你不会在这么低的层次下工作。
对内存中的 XML 的处理则更加方便,但没有单一、标准的方式。如下所有的类都支持对 XML 的读取和导航:
- XmlDocument :它是 XML 数据的标准化接口,但对时间要求比较多。
- XPathNavigator :它提供比 XML DOM 稍快、更有效的模型,并增强了一些搜索功能,但不能修改或保存 XML 。
- XDocument :为处理 XML 提供一个更直观和有效的 API。从技术上讲,它是 LINQ to XML 的一部分,但即使没有 LINQ 查询,它也很有用。
XmlDocument
XmlDocument 把信息保存为树的节点。节点是 XML 文件的基本组成部分,它可以使一个元素、特性、注释或者元素的一个值。
为了挖掘树的所有层次,下面这个示例使用了递归来操作 XmlDocument 类:
object sender, EventArgs e)
{
string xmlFile = Server.MapPath("DvdList.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlFile); // doc.LoadXml() 可以接收一个XML格式的字符串
string str = GetChildNodesDescr(doc.ChildNodes, 0);
Response.Write(str);
}
private string GetChildNodesDescr(XmlNodeList nodeList, int level)
{
string indent = "";
for (int i = 0; i < level; i++)
{
indent += "";
}
StringBuilder str = new StringBuilder();
foreach (XmlNode node in nodeList)
{
switch (node.NodeType)
{
case XmlNodeType.Comment:
str.Append(indent);
str.Append("Comment: <b>");
str.Append(node.Value).Append("</b><br />");
break;
case XmlNodeType.Element:
str.Append(indent);
str.Append("Element: <b>").Append(node.Name).Append("</b><br />");
break;
case XmlNodeType.Text:
str.Append(indent);
str.Append(" - Value: <b>");
str.Append(node.Value).Append("</b><br />");
break;
case XmlNodeType.XmlDeclaration:
str.Append("XML Declaration: <b>").Append(node.Name);
str.Append(" ").Append(node.Value).Append("</b><br />");
break;
}
if (node.Attributes != null)
{
foreach (XmlAttribute attribute in node.Attributes)
{
str.Append(indent).Append(" - Attribute: <b>");
str.Append(attribute.Name).Append("</b> - Value: <b>");
str.Append(attribute.Value).Append("</b><br />");
}
}
if (node.HasChildNodes) // node.ChildNodes.Count != 0
{
// level 作为递归传递的变量,进入新方法后自然会递增
// 因此这里一定不能用 (level++) 或 ++level 否则排版会乱
str.Append(GetChildNodesDescr(node.ChildNodes, level+1));
}
}
return str.ToString();
}