【转】循环递归遍历XML文档或按某要求遍历XML文档
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
</catalog>
CDList.xml文档如下:
private void button1_Click(object sender, EventArgs e)
{
this.FindNode();
}
private void FindNode()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"f:\svse\CDList.xml");//加载XML文档
foreach (XmlNode node in doc.ChildNodes)
{
if (node.HasChildNodes)//判断是否有子节点
{
FindNode(node);
}
}
}
private void FindNode(XmlNode node)
{
foreach (XmlNode subNode in node.ChildNodes)
{
FindNode(subNode); //实现递归遍历
//利用if语句只对文本节点进行相关的处理。
if (subNode.Name == "#text")//#text为文本节点的名字
{
this.textBox1.Text += "\r\n" + subNode.Value;//当前节点的值
}
}
}
程序.cs文件
注意:当前节点的另外几个重要属性和方法的用法
属性FirstChild,返回当前节点的第一个子节点
属性NextSibling,返回当前节点的第一个兄弟节点
//下面的示例通过XML数据流来读取 XML 文件并显示每个节点。
<?xml version="1.0"?> <!-- This is a sample XML document --> <!DOCTYPE Items [<!ENTITY number "123">]> <Items> <Item>Test with an entity: &number;</Item> <Item>Test with a child element <more/> stuff</Item> <Item>Test with a CDATA section <![CDATA[<456>]]> def</Item> <Item>Test with a_ char entity: A</Item> <!-- Fourteen_ chars in this element.--> <Item>1234567890ABCD</Item> </Items>
items.xml 文档如下:
XmlReader reader = XmlReader.Create("item.xml");
//当第一次创建和初始化 XmlReader 时,没有可用的信息。必须调用 Read 读取第一个节点。
reader.MoveToContent();
// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
Console.Write("<{0}>", reader.Name);
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:
break;
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;
}
}
遍历程序片断如下:
<book>
<title>Pride And Prejudice</title>
<price>19.95</price>
</book>
下面是book.xml文件
using System;
using System.xml; static void Main(String[] args) { using (XmlReader reader = XmlReader.Create("f:\\svse\\book.xml")) { reader.Read(); //检查当前节点是否为元素并将读取器推进到下一个节点 //该方法先后调用IsStartElement和Read将你定位在输入流中所找到的元素的内容上。 reader.ReadStartElement("book"); //挖到子节点 reader.ReadStartElement("title"); Console.Write("The content of the title element: "); // ReadString() 方法,该方法返回元素的内容、文本、空白、重要空白或 CDATA 节点。 // 如果定位在元素上,ReadString 将所有文本、重要的空白、空白和 CDATA 节点串联在一起, // 然后将串联在一起的数据作为元素内容返回。当遇到任何标记时,它就会停止。 Console.WriteLine(reader.ReadString()); reader.ReadEndElement(); reader.ReadStartElement("price"); Console.Write("The content of the price element: "); Console.WriteLine(reader.ReadString()); reader.ReadEndElement(); reader.ReadEndElement(); } }
//通过XML数据流对XML文档进行处理。
------------------------------------------------------------------------
读例程
------------------------------------------------------------------------
<!-- sample xml file -->
<bookstore>
<book genre='novel' ISBN='10-861003-324'>
<title>The Handmaid's Tale</title>
<price>19.95</price>
</book>
<book genre='novel' ISBN='1-861001-57-5'>
<title>Pride And Prejudice</title>
<price>24.95</price>
</book>
</bookstore>
XML文件
using (XmlReader reader = XmlReader.Create("books.xml"))
{
reader.ReadToFollowing("book");//一直读取,直到找到具有指定限定名的元素。
do
{
Console.WriteLine("ISBN: {0}", reader.GetAttribute("ISBN")); //获得指定属性的值
}while (reader.ReadToNextSibling("book"));
//ReadToNextSibling("book")方法,让 XmlReader 前进到下一个具有指定限定名的同级元素
}
//取每个书节点上的ISBN属性
<login>
<user name=’zhang’ pwd=’123’/>
<user name=’wang’ pwd=’456’/>
</login>
根据上面实例可以考虑当要读取xml中的用户名和密码时可以这样设计xml文档。
using (XmlReader reader = XmlReader.Create("2books.xml"))
{
//让 XmlReader 前进到下一个具有指定限定名的子代元素。
reader.ReadToDescendant("book"); // 第一个book
//跳过当前节点的子级。定位到下一个同级节点上。可能是Whitespace节点
reader.Skip();
//检查当前节点是否是内容节点。
//如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。
reader.MoveToContent(); // 第二个book
}
跳到子节点
总结:
ReadToFollowing(string)
ReadToNextSibling(string)
ReadToDescendant()
Skip()
以上四个方法都可以定位,它们之间有何区别呢?
ReadToFollowing(string):是从当前位置一直读取,直到找到具有指定限定名的元素。
ReadToNextSibling(string):让 XmlReader 前进到下一个具有指定限定名的同级元素
ReadToDescendant(string):让 XmlReader 前进到下一个具有指定限定名的子代元素
Skip():跳过当前节点的子级。定位到下一个同级节点上。可能是Whitespace节点
【转】循环递归遍历XML文档或按某要求遍历XML文档的更多相关文章
- iis设置默认文档,提示web.config配置xml格式不正确
网站上传后,配置默认文档,提示web.config配置xml格式不正确,几经尝试,发现是sqlserver密码中的“&”符号惹的祸,web.config文件中不能使用该字符.分享出来,大家遇到 ...
- 一文读懂四种常见的XML解析技术
之前的文章我们讲解了<XML系列教程之Schema技术_上海尚学堂java培训技术干货><XML的概念.特点与作用.XML申明_上海Java培训技术干货>,大家可以点击回顾一下 ...
- 五二不休息,今天也学习,从JS执行栈角度图解递归以及二叉树的前、中、后遍历的底层差异
壹 ❀ 引 想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦.由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断 ...
- 常用控件产品官方文档/手册/API列表 c#控件文档API列表 asp.net控件产品技术文档中文版
.netCHARTING报表图表控件 文档帮助手册Ab3d.PowerToys 文档帮助手册Ab3d.Reader3ds 文档帮助手册ABViewer 文档帮助手册 (工程图纸文档管理系统)Activ ...
- 【SharePoint 文档管理解决方案设计系列一】文档使用分析
在我们在 SharePoint 端设计文档管理解决方案之前我们要了解目前客户在他们已有的系统里是怎么对文档进行使用和管理的.只有了解了当前的使用情况才能根据客户的需求量身定做一套适合他们的有效的解决方 ...
- jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档。
jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档. jquery.cookie中的操作: jquery.cookie.js是一个基于jquer ...
- linux循环递归设置权限
这里给出一个循环递归得到对文件夹和文件分别有效的设置方法: find /path -type f -exec chmod 644 {} \; #对目录和子目录里的文件 find /path -type ...
- Java 写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档
写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档 import java.io.File; import java.io.FileNotFoundException; import ...
- Learning to rank的讲解,单文档方法(Pointwise),文档对方法(Pairwise),文档列表方法(Listwise)
学习排序(Learning to Rank) LTR(Learning torank)学习排序是一种监督学习(SupervisedLearning)的排序方法.LTR已经被广泛应用到文本挖掘的很多领域 ...
随机推荐
- BZOJ 2298: [HAOI2011]problem a 动态规划
2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...
- 【ALearning】第三章 Android基本常见控件
本章主要介绍主要的寻常较多使用的控件,包含TextView.EditView.ImageView.Button等.本章将介绍相关控件基本属性的使用,为以后章节的进阶学习提供基础.案例中引用的Linea ...
- java 引用类型及作用
0. 引言 Java 中一共有 4 种类型的引用 : StrongReference. SoftReference. WeakReference 以及 PhantomReference , 这 4 种 ...
- (转)如何在JavaScript与ActiveX之间传递数据2
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...
- 文件I/O之ioctl函数
ioctl函数是I/O操作的杂物箱.不能用其他函数表示的I/O操作通常都能用ioctl表示.终端I/O是ioctl的最大使用方面. ioctl函数通过对文件描述符发送特定的命令来控制文件描述符所代表的 ...
- 介绍一些实用的IOS手势识别库 (COCOS2D)
http://www.supersuraccoon-cocos2d.com/zh/2012/11/14/introduction-to-some-great-ios-gesture-recogniti ...
- HTTPS协议学习总结
目录 一:什么是HTTPS协议?二:客户端与服务端如何建立HTTPS协议连接?三:证书.加密协议.信息摘要.签名算法概念解释与关系梳理四:低版本操作系统作为客户端发送HTTPS失败分析五:参考资料 ...
- [MSDN]关键字查询语言 (KQL) 语法参考
MSDN:http://msdn.microsoft.com/library/ee558911(v=office.15) 了解如何构造 SharePoint 2013 中的搜索功能 的 KQL 查询. ...
- JDK Tools - jinfo: Java 配置信息工具
jinfo 是 JDK 自带的配置信息工具,可以查看.设置 Java 进程的参数配置. 命令格式 jinfo [ option ] pidjinfo [ option ] executable cor ...
- [转]深入理解jQuery插件开发
如果你看到这篇文章,我确信你毫无疑问会认为jQuery是一个使用简便的库.jQuery可能使用起来很简单,但是它仍然有一些奇怪的地方,对它基本功能和概念不熟悉的人可能会难以掌握.但是不用担心,我下面已 ...