C#操作Xml:通过XmlDocument读写Xml文档
.Net那点事儿系列:C#操作Xml
什么是Xml?
Xml是扩展标记语言的简写,是一种开发的文本格式。关于它的更多情况可以通过w3组织了解http://www.w3.org/TR/1998/REC-xml-19980210。如果你不知道它,那你就out太多了。
.Net是如何处理Xml的?
1. 通过XmlDocument读写Xml文档
2. 使用XmlReader读Xml, 使用XmlWriter写Xml
3. 使用Linq to xml存取XML
4. 通过XmlScheme定义固定格式xml文档
5. Xml序列化或者反序列化类
6. 通过XPath查找Xml节点
7. 通过Xslt转化Xml格式
通过XmlDocument读写Xml文档
有如下一段Xml:
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
students
>
<!--我是一段注释文字-->
<
student
name
=
"张平"
>
<
courses
>
<
course
name
=
"语文?"
>
<
teacherComment
>
<![CDATA[
这里是语文老师的批注
]]>
</
teacherComment
>
</
course
>
<
course
name
=
"数学"
>
<
teacherComment
>
<![CDATA[
这里是数学老师的批注
]]>
</
teacherComment
>
</
course
>
</
courses
>
</
student
>
</
students
>
|
1.如何使用XmlDocument读取Xml
我要用一段代码遍历所有Student,并打印Student的所有属性和子节点的值
/*玉开博客 http://www.cnblogs.com/yukaizhao/ */
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Xml;
namespace
XmlExample
{
class
Program
{
static
void
Main(
string
[] args)
{
string
xmlFilePath =
@"X:\about.net\example\XmlExample\1.xml"
;
XmlDocument doc =
new
XmlDocument();
doc.Load(xmlFilePath);
//使用xpath表达式选择文档中所有的student子节点
XmlNodeList studentNodeList = doc.SelectNodes(
"/students/student"
);
if
(studentNodeList !=
null
)
{
foreach
(XmlNode studentNode
in
studentNodeList)
{
//通过Attributes获得属性名字为name的属性
string
name = studentNode.Attributes[
"name"
].Value;
Console.WriteLine(
"Student:"
+ name);
//通过SelectSingleNode方法获得当前节点下的courses子节点
XmlNode coursesNode = studentNode.SelectSingleNode(
"courses"
);
//通过ChildNodes属性获得courseNode的所有一级子节点
XmlNodeList courseNodeList = coursesNode.ChildNodes;
if
(courseNodeList !=
null
)
{
foreach
(XmlNode courseNode
in
courseNodeList)
{
Console.Write(
"\t"
);
Console.Write(courseNode.Attributes[
"name"
].Value);
Console.Write(
"老师评语"
);
//通过FirstNode属性可以获得课程节点的第一个子节点,LastNode可以获得最后一个子节点
XmlNode teacherCommentNode = courseNode.FirstChild;
//读取CData节点
XmlCDataSection cdata = (XmlCDataSection)teacherCommentNode.FirstChild;
Console.WriteLine(cdata.InnerText.Trim());
}
}
}
}
Console.Write(
"\r\nPress any key to continue...."
);
Console.Read();
}
}
}
|
XmlDocument本身是从XmlNode继承的,读Xml节点可以通过FirstChild,LastChild,或者NextSibling,PreviousSibling读取单个节点,或者通过ChildNodes读取所有子节点。还可以使用XPath表达式使用SelectNodes(string xpath)或者SelectSingleNode(string xpath)读取单个或者多个符合条件的节点。
2.如何通过XmlDocument编辑Xml
同样是读取Xml中的xml例子,我们这次要用csharp代码生成xml,如下代码:
/*玉开博客 http://www.cnblogs.com/yukaizhao/ */
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Xml;
namespace
WriteXml
{
class
Program
{
static
void
Main(
string
[] args)
{
XmlDocument xmlDoc =
new
XmlDocument();
//创建Xml声明部分,即<?xml version="1.0" encoding="utf-8" ?>
xmlDoc.CreateXmlDeclaration(
"1.0"
,
"utf-8"
,
"yes"
);
//创建根节点
XmlNode rootNode = xmlDoc.CreateElement(
"students"
);
//创建student子节点
XmlNode studentNode = xmlDoc.CreateElement(
"student"
);
//创建一个属性
XmlAttribute nameAttribute = xmlDoc.CreateAttribute(
"name"
);
nameAttribute .Value =
"张同学"
;
//xml节点附件属性
studentNode.Attributes.Append(nameAttribute);
//创建courses子节点
XmlNode coursesNode = xmlDoc.CreateElement(
"courses"
);
XmlNode courseNode1 = xmlDoc.CreateElement(
"course"
);
XmlAttribute courseNameAttr = xmlDoc.CreateAttribute(
"name"
);
courseNameAttr.Value =
"语文"
;
courseNode1.Attributes.Append(courseNameAttr);
XmlNode teacherCommentNode = xmlDoc.CreateElement(
"teacherComment"
);
//创建Cdata块
XmlCDataSection cdata = xmlDoc.CreateCDataSection(
"<font color=\"red\">这是语文老师的批注</font>"
);
teacherCommentNode.AppendChild(cdata);
courseNode1.AppendChild(teacherCommentNode);
coursesNode.AppendChild(courseNode1);
//附加子节点
studentNode.AppendChild(coursesNode);
rootNode.AppendChild(studentNode);
//附加根节点
xmlDoc.AppendChild(rootNode);
//保存Xml文档
xmlDoc.Save(
@"d:\test.xml"
);
Console.WriteLine(
"已保存Xml文档"
);
}
}
}
|
使用XmlDocument生成xml的要点在于使用xmlDocument的实例的CreateElement创建XmlNode或者通过CreateAttribute方法创建属性,并通过AppendChild方法附加xml节点,通过AppendAttribute附加Attribute到节点的属性集合。