使用递归读写XML文档

说一下HTML与XML相同点与不同点

1、两者都是标记语言

2、HTML一般用于数据展示,而XML用于数据存储(购物车里的物品信息)

3、常说的XHTML其实就是符合XML规范的HTML

 

XML的语法特点

1、严格区分大小写

2、有且只有一个根节点

3、没有预定义标签,标签名字可以随便取这点与HTML不同,但要成对出现  

4、想要测试写的XML文档是否正确可以把文件丢到浏览器中,如果与编写的代码一直则正确,否则浏览器会提示错误信息

 

以下是写XML文档源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace 写XML文档
{
class Program
{
static void Main(string[] args)
{
//创建XML文档对象
XDocument xdoc = new XDocument();
//创建school根节点<school></school>
XElement root = new XElement("school");
//添加属性<school name="xx大学">
root.SetAttributeValue("name", "xx大学");

XElement grade1 = new XElement("class");
grade1.SetAttributeValue("classNo", "101");
XElement stu1 = new XElement("student");
stu1.SetAttributeValue("stuNo", "10100");
//添加末级元素<name>张三</name>,当然也可以重新定义一个节点对象用父节点.add()添加该子节点
stu1.SetElementValue("name", "张三");
stu1.SetElementValue("age", "23");
stu1.SetElementValue("gender", "男");
XElement stu2 = new XElement("student");
stu2.SetAttributeValue("stuNo", "10101");
stu2.SetElementValue("name", "婷婷");
stu2.SetElementValue("age", "23");
stu2.SetElementValue("gender", "女");

XElement grade2 = new XElement("class");
grade1.SetAttributeValue("classNo", "201");

//这里才是真正节点关系的代码,父节点.add(子节点),一层层嵌套
xdoc.Add(root);
root.Add(grade1, grade2);
grade1.Add(stu1, stu2);
//保存文件默认路径在debug文件夹下
xdoc.Save("Test.xml");
}
}
}

 

以下是递归读XML文档源码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace 读XML文件
{
class Program
{
static void Main(string[] args)
{
//加载XML文档
XDocument xdoc = XDocument.Load("First.xml");
//获取XML文档的根节点
XElement root = xdoc.Root;
try
{
//如果根节点没有Attribute值就进入catch中,如果有值就打印
XAttribute attribute = root.Attribute(root.Attributes().ToArray()[0].Name);
Console.WriteLine(root.Name + " " + attribute.Name + "=\"" + attribute.Value);
}
catch
{
Console.WriteLine(root.Name);
}
Recursion(root.Elements());
Console.ReadKey();
}

/// <summary>
/// 递归找根节点下所有子节点
/// </summary>
/// <param name="list">根节点下所有子节点(不包括根节点)</param>
static void Recursion(IEnumerable<XElement> list)
{
string a = string.Empty;
//迭代所有子节点
foreach (var item in list)
{
//如果任意一个子节点有
if (item.Attributes().Count() > 0)
{
//迭代任意节点的所有属性进行拼接
foreach (var attribute in item.Attributes())
{
a = " " + attribute.Name + "=" + attribute.Value;
}
}
//用于判断该节点下是否还存在子节点,如果没有说明是最后一级,往往最后一级写的是所需要的数据(作用就是得到最后一级别的数据)
if (!item.HasElements)
{
if (item.Value != null && item.Value != string.Empty)
{
a += " " + item.Name + "=" + "\"" + item.Value + "\"";
}
}
Console.WriteLine(item.Name + a);
//输出一个节点对拼接进行清空
a = String.Empty;
//如果该节点下仍有子节点就递归
if (item.Nodes().Count() > 0 && item.HasElements)
{
Recursion(item.Elements());
}
}
}
}
}

posted @ 2017-01-19 14:31  南京夜空中最亮的星  阅读(221)  评论(0编辑  收藏  举报