剖析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处理,如果有什么总结的不好请多多指教,如果感兴趣的话关注本人一下