内存中的 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();
}

相关文章:

  • 2022-01-29
  • 2021-09-02
  • 2022-12-23
  • 2021-09-02
  • 2021-09-02
  • 2021-09-17
  • 2022-12-23
猜你喜欢
  • 2021-10-26
  • 2022-02-05
  • 2022-03-07
  • 2022-12-23
相关资源
相似解决方案