剖析XML(第二讲)

在前一天说到了写入XML,这一次我总结了一下读取XML

  读取XML有两种方式:

    1.你可以用XMLDocument、XPathNavigator、或XDocument类一次性将文档加载到内存中。这3个类中,只有XPathNavigator是只读的。

    2.使用XmlTextReader类(是基于流的读取器),你可以每次读取文档的一个节点。

  基于流的方式减少了内存负担并且通常更高效。如果要对XML文档执行一个耗时的任务,且知道其他用户可能也要访问该文件时,你可能会选择在内存中操作的方式以减少文件打开的时间

  虽然使用XmlTextReader对象读取XML文件时最简单的方法,但他也只提供了最少的灵活性。文件以顺序读取,不能够处理内存中的XML那样自由的移动到父、子、兄弟节点。相反,每次从流中读取一个节点。通常,需要编写一个活多个嵌入的循环以深入XML文档中的元素,直到找到要找的内容。

  下面的代码首先在XmlTextReader对象里加载源文件,然后开始一个每次移动一个文档节点的循环。为了从一个节点移动到另一个节点,需要调用XmlTextReader.Reader()方法。这个方法在移动到左后一个节点时返回true。DataReader类也使用了类似的策略,它从数据区得查询结果。

代码如下:

private void ReadXML()
    {
        //获取路径
        string xmlFile = Server.MapPath("DvdList.xml");
        //创建XmlTextReader对象
        XmlTextReader reader = new XmlTextReader(xmlFile);
        StringBuilder str = new StringBuilder();
        //读取数据
        while (reader.Read()) {
            switch (reader.NodeType) { 
                case XmlNodeType.XmlDeclaration://xml声明
                    str.Append("XML Declaration:<b>");
                    str.Append(reader.Name);//获取节点的限定名
                    str.Append(" ");
                    str.Append(reader.Value);//获取节点的文本值
                    str.Append("</b><br/>");
                    break;
                case XmlNodeType.Element://元素类型
                    str.Append("Element:<b>");
                    str.Append(reader.Name);
                    str.Append("</b><br/>");
                    break;
                case XmlNodeType.Text:
                    str.Append("- value:<b>");
                    str.Append(reader.Value);
                    str.Append("</b><br/>");
                    break;
            }
            if (reader.AttributeCount > 0) {//判断是否有属性
                while (reader.MoveToNextAttribute()) {
                    str.Append("- Attribute:<b>");
                    str.Append(reader.Name);
                    str.Append("</b> Value:<b>");
                    str.Append(reader.Value);
                    str.Append("</b><br/>");
                }
            }
        }
        reader.Close();
        this.Label1.Text = str.ToString();
    }

下一次总结内存中的xml处理,如果有什么总结的不好请多多指教,如果感兴趣的话关注本人一下

原文地址:https://www.cnblogs.com/guozhe/p/2566174.html