学习: .NET XML实例演练,遍历XML文档和构造XML文档
2016-04-26 13:44
405 查看
学习: .NET XML实例演练,遍历XML文档和构造XML文档
撰写日期:9:29 2016/4/26更新日期:9:29 2016/4/26
发布地址:http://www.cnblogs.com/gibbonnet/p/5434794.html
任务:
从XMLDocument遍历为Collection从Collection构造XMLDocument
源代码
using System; using System.Collections.Generic; using System.Data; using System.Xml; using System.IO; namespace DemoXML { /// <summary> /// 演练XML,将XML构造为集合,从集合构造XML /// </summary> class Program { public static void Main() { // 创建XMl文档并载入内容 XmlDocument xd = new XmlDocument(); xd.LoadXml(File.ReadAllText(@"schema.xml")); // 从XML文档提取Node集合 List<XmlNode> nodeCollection = new List<XmlNode>(); Traverse(xd.DocumentElement, nodeCollection); // 从Node集合构造XML文档,并输出 XmlDocument newXml = BuildXml(nodeCollection); File.WriteAllText(@"out.xml", newXml.OuterXml); } /// <summary> /// 深度优先遍历XML文档,提取节点集合 /// </summary> /// <param name="node">根节点</param> /// <param name="list">节点集合</param> public static void Traverse(XmlNode node, List<XmlNode> list) { // 忽略空白节点 if (node.NodeType == XmlNodeType.SignificantWhitespace) return; list.Add(node); // 遍历子节点 foreach (XmlNode child in node.ChildNodes) { Traverse(child, list); } } /// <summary> /// 从元素集合创建新的XMLDocument /// </summary> /// <param name="list">深度优先遍历提取的节点集合</param> /// <returns></returns> public static XmlDocument BuildXml(List<XmlNode> list) { XmlDocument newDoc = new XmlDocument(); // 堆栈,用于存储已经创建的节点,作为后面节点的父节点 Stack<XmlNode> createdNodes = new Stack<XmlNode>(); foreach(XmlNode node in list) { // 元素节点 if (node.NodeType == XmlNodeType.Element) { XmlElement newNode = newDoc.CreateElement(node.Name); // 设置属性 foreach(XmlAttribute att in node.Attributes) { newNode.SetAttribute(att.Name, att.Value); } newNode.InnerText = ""; if (createdNodes.Count == 0) { newDoc.AppendChild(newNode); } else { // 非父节点出栈 while (createdNodes.Peek().Name != node.ParentNode.Name) { createdNodes.Pop(); } createdNodes.Peek().AppendChild(newNode); } // 新节点入栈 createdNodes.Push(newNode); } // 文本节点 if (node.NodeType == XmlNodeType.Text) { if(node.ParentNode.Name == createdNodes.Peek().Name) { createdNodes.Peek().InnerText = node.Value; } } } return newDoc; } } }
输入
<?xml version="1.0" encoding="utf-8" ?> <do_main0217List xml:space="preserve"> <do_main0217 xml:space="preserve"> <NM description="内码" type="string"></NM> <Creator description="创建人" type="string"></Creator> <CreatedDate description="创建时间" type="dateTime">0001-01-01T00:00:00+08:00</CreatedDate> <LastModifier description="最后修改人" type="string"></LastModifier> <LastModifiedDate description="最后修改时间" type="dateTime">0001-01-01T00:00:00+08:00</LastModifiedDate> <Code description="编号" type="string"></Code> <Name description="名称" type="string"></Name> <Djzt description="单据状态" type="integer">0</Djzt> <Lcsl description="流程实例" type="string"></Lcsl> <do_congbiao0217List xml:space="preserve"> <do_congbiao0217 xml:space="preserve"> <NM description="内码" type="string"></NM> <Creator description="创建人" type="string"></Creator> <CreatedDate description="创建时间" type="dateTime">0001-01-01T00:00:00+08:00</CreatedDate> <LastModifier description="最后修改人" type="string"></LastModifier> <LastModifiedDate description="最后修改时间" type="dateTime">0001-01-01T00:00:00+08:00</LastModifiedDate> <Code description="编号" type="string"></Code> <Name description="名称" type="string"></Name> <PNM description="父内码" type="string"></PNM> </do_congbiao0217> </do_congbiao0217List> <do_congbiao0325List xml:space="preserve"> <do_congbiao0325 xml:space="preserve"> <NM description="内码" type="string"></NM> <Creator description="创建人" type="string"></Creator> <CreatedDate description="创建时间" type="dateTime">0001-01-01T00:00:00+08:00</CreatedDate> <LastModifier description="最后修改人" type="string"></LastModifier> <LastModifiedDate description="最后修改时间" type="dateTime">0001-01-01T00:00:00+08:00</LastModifiedDate> <Code description="编号" type="string"></Code> <Name description="名称" type="string"></Name> <PNM description="父内码" type="string"></PNM> </do_congbiao0325> </do_congbiao0325List> </do_main0217> </do_main0217List>
输出
<do_main0217List xml:space="preserve"><do_main0217 xml:space="preserve"><NM description="内码" type="string"></NM><Creator description="创建人" type="string"></Creator><CreatedDate description="创建时间" type="dateTime">0001-01-01T00:00:00+08:00</CreatedDate><LastModifier description="最后修改人" type="string"></LastModifier><LastModifiedDate description="最后修改时间" type="dateTime">0001-01-01T00:00:00+08:00</LastModifiedDate><Code description="编号" type="string"></Code><Name description="名称" type="string"></Name><Djzt description="单据状态" type="integer">0</Djzt><Lcsl description="流程实例" type="string"></Lcsl><do_congbiao0217List xml:space="preserve"><do_congbiao0217 xml:space="preserve"><NM description="内码" type="string"></NM><Creator description="创建人" type="string"></Creator><CreatedDate description="创建时间" type="dateTime">0001-01-01T00:00:00+08:00</CreatedDate><LastModifier description="最后修改人" type="string"></LastModifier><LastModifiedDate description="最后修改时间" type="dateTime">0001-01-01T00:00:00+08:00</LastModifiedDate><Code description="编号" type="string"></Code><Name description="名称" type="string"></Name><PNM description="父内码" type="string"></PNM></do_congbiao0217></do_congbiao0217List><do_congbiao0325List xml:space="preserve"><do_congbiao0325 xml:space="preserve"><NM description="内码" type="string"></NM><Creator description="创建人" type="string"></Creator><CreatedDate description="创建时间" type="dateTime">0001-01-01T00:00:00+08:00</CreatedDate><LastModifier description="最后修改人" type="string"></LastModifier><LastModifiedDate description="最后修改时间" type="dateTime">0001-01-01T00:00:00+08:00</LastModifiedDate><Code description="编号" type="string"></Code><Name description="名称" type="string"></Name><PNM description="父内码" type="string"></PNM></do_congbiao0325></do_congbiao0325List></do_main0217></do_main0217List>
外接
XmlNoteType枚举// // 摘要: // 如果未调用 Read 方法,则由 System.Xml.XmlReader 返回。 None = 0, // // 摘要: // 元素(例如,<item>)。 Element = 1, // // 摘要: // 特性(例如,id='123')。 Attribute = 2, // // 摘要: // 节点的文本内容。 Text = 3, // // 摘要: // CDATA 节(例如,<![CDATA[my escaped text]]>)。 CDATA = 4, // // 摘要: // 实体引用(例如,#)。 EntityReference = 5, // // 摘要: // 实体声明(例如,<!ENTITY...>)。 Entity = 6, // // 摘要: // 处理指令(例如,<?pi test?>)。 ProcessingInstruction = 7, // // 摘要: // 注释(例如,<!-- my comment -->)。 Comment = 8, // // 摘要: // 作为文档树的根的文档对象提供对整个 XML 文档的访问。 Document = 9, // // 摘要: // 由以下标记指示的文档类型声明(例如,<!DOCTYPE...>)。 DocumentType = 10, // // 摘要: // 文档片段。 DocumentFragment = 11, // // 摘要: // 文档类型声明中的表示法(例如,<!NOTATION...>)。 Notation = 12, // // 摘要: // 标记间的空白。 Whitespace = 13, // // 摘要: // 混合内容模型中标记间的空白或 xml:space="preserve" 范围内的空白。 SignificantWhitespace = 14, // // 摘要: // 末尾元素标记(例如,</item>)。 EndElement = 15, // // 摘要: // 由于调用 System.Xml.XmlReader.ResolveEntity 而使 XmlReader 到达实体替换的末尾时返回。 EndEntity = 16, // // 摘要: // XML 声明(例如,<?xml version='1.0'?>)。 XmlDeclaration = 17
相关文章推荐
- HNOI2016 游记
- 导入hadoop Maven项目时,eclipse pom.xml提示Missing artifact jdk.tools:jdk.tools:jar:1.6 的解决方案
- java学习笔记
- 003-storm设计思想和处理过程
- Item 06: 若不想使用编译器自动生成的函数,就该明确拒绝
- flume 使用 spool source的时候字符集出错
- Newtonsoft.Json
- Linux下Keepalived 安装与配置
- SQLZOO(More JOIN operations)Writeup
- 我U盘中的efi manager
- iOS程序启动原理
- CentOS7.1上安装Apache + SVN
- ios导航栏透明
- 信长之野望
- APNs改动 (转)
- 使用JS遇到的问题点
- JavaScript 函数讲解
- 002-storm基本概念
- String类中常用方法归纳
- 百度云盘资料查询地址