在.NET 对XML的一些基本操作
今天在网上根据自己的需要找了一些关于.NET下对XML操作的教程。对比之下,发现:代码的说服力远强于文字。当然,只是对我所需要的这点知识点来说是这样。废话少说,上代码!
1
//这是第一种方法:
2![]()
3
XmlDocument xmldoc; /*首先是声明一个XML文档。*/
4
xmldoc = new XmlDocument(); /*实例化。*/
5
XmlDeclaration xmldecl; /*这里是声明一个XML的声明。*/
6
xmldecl = xmldoc.CreateXmlDeclaration("1.0", "UTF-8",null); /*分别对应 version,encoding,standalong。对standalong 属性的一些说明:这个属性指的是xml是否独立存在,即是否有一个额外的DTD文件。例如,当为yes时指的就是不纯在额外的和本XML相关连得DTD文件。 我真啰嗦。*/
7
xmldoc.AppendChild(xmldecl); /*AppendChild()方法会添加节点,这里就是把声明 添加上了。*/
8
XmlElement xmlele;
9
xmlele = xmldoc.CreateElement("目录");
10
xmldoc.AppendChild(xmlele); /*声明,实例化,添加 根元素。*/
11
XmlNode xmlnod; /*声明一个节点,注意,是节点不是元素。节点是可以记录结构信息并修改结构的类,而元素还包含了属性和值的概念。 不一样啊!*/
12
for (int i = 0; i < 2; ++i)
13
{
14![]()
15
xmlnod = xmldoc.SelectSingleNode("目录"); /*xmlnod节点记录了 包含有“目录”的节点位置。*/
16
XmlElement shuji;
17
shuji = xmldoc.CreateElement("书籍");
18
XmlElement shuming = xmldoc.CreateElement("书名");
19
if (0 == i)
20
{
21
shuming.InnerText = "我的书";/*向名为“书名”的元素中添加值。*/
22
}
23
else
24
{
25
shuming.InnerText = "你的书";
26
}
27
shuji.AppendChild(shuming); /*经创建的元素添加到另一元素下。 */
28
XmlElement zuozhe = xmldoc.CreateElement("作者");
29
if (0 == i)
30
{
31
zuozhe.InnerText = "我";
32
}
33
else
34
{
35
zuozhe.InnerText = "你";
36
}
37
shuji.AppendChild(zuozhe);
38
XmlElement jiage = xmldoc.CreateElement("价格");
39
jiage.SetAttribute("币种","人民币");/* 添加属性 SetAttribute(属性名,属性值)。*/
40
jiage.InnerText = "100";
41
shuji.AppendChild(jiage);
42
xmlnod.AppendChild(shuji);
43
}
44
xmldoc.Save(Server.MapPath("my.xml"));/*保存在 内存 中已经建立好的 XML文件。*/
//这是第一种方法:2

3
XmlDocument xmldoc; /*首先是声明一个XML文档。*/4
xmldoc = new XmlDocument(); /*实例化。*/5
XmlDeclaration xmldecl; /*这里是声明一个XML的声明。*/6
xmldecl = xmldoc.CreateXmlDeclaration("1.0", "UTF-8",null); /*分别对应 version,encoding,standalong。对standalong 属性的一些说明:这个属性指的是xml是否独立存在,即是否有一个额外的DTD文件。例如,当为yes时指的就是不纯在额外的和本XML相关连得DTD文件。 我真啰嗦。*/7
xmldoc.AppendChild(xmldecl); /*AppendChild()方法会添加节点,这里就是把声明 添加上了。*/8
XmlElement xmlele;9
xmlele = xmldoc.CreateElement("目录");10
xmldoc.AppendChild(xmlele); /*声明,实例化,添加 根元素。*/11
XmlNode xmlnod; /*声明一个节点,注意,是节点不是元素。节点是可以记录结构信息并修改结构的类,而元素还包含了属性和值的概念。 不一样啊!*/12
for (int i = 0; i < 2; ++i)13
{14

15
xmlnod = xmldoc.SelectSingleNode("目录"); /*xmlnod节点记录了 包含有“目录”的节点位置。*/16
XmlElement shuji;17
shuji = xmldoc.CreateElement("书籍");18
XmlElement shuming = xmldoc.CreateElement("书名");19
if (0 == i)20
{21
shuming.InnerText = "我的书";/*向名为“书名”的元素中添加值。*/22
}23
else24
{25
shuming.InnerText = "你的书";26
}27
shuji.AppendChild(shuming); /*经创建的元素添加到另一元素下。 */28
XmlElement zuozhe = xmldoc.CreateElement("作者");29
if (0 == i)30
{31
zuozhe.InnerText = "我";32
}33
else34
{35
zuozhe.InnerText = "你";36
}37
shuji.AppendChild(zuozhe);38
XmlElement jiage = xmldoc.CreateElement("价格");39
jiage.SetAttribute("币种","人民币");/* 添加属性 SetAttribute(属性名,属性值)。*/40
jiage.InnerText = "100";41
shuji.AppendChild(jiage);42
xmlnod.AppendChild(shuji);43
}44
xmldoc.Save(Server.MapPath("my.xml"));/*保存在 内存 中已经建立好的 XML文件。*/ 1
//这是第二种方法:
2
XmlTextWriter xmltw; /*声明一个表示提供快速、非缓存、只进方法的编写器,该方法生成包含 XML 数据的流或文件。*/
3
String xmlfile = Server.MapPath("my2.xml");/*建立该XML文件。*/
4
xmltw = new XmlTextWriter(xmlfile,null);/*指定要写入的文件和编码方式。莫忘!*/
5
xmltw.Formatting = Formatting.Indented;/*制定写入格式,此处为缩进格式。*/
6
xmltw.WriteStartDocument();/*本方法创建XML声明。*/
7
xmltw.WriteStartElement("目录");/*本方法创建元素。*/
8
xmltw.WriteStartElement("书籍");
9
xmltw.WriteStartElement("书名"); //》》》》》》》》》》
10
xmltw.WriteString("我的书");// 此方法创建元素值 》 这三行代码创建了一个完整的元素包含:起始 值 结束。
11
xmltw.WriteEndElement();//此方法创建元素结束标识》》》》
12
xmltw.WriteStartElement("作者");
13
xmltw.WriteString("我");
14
xmltw.WriteEndElement();
15
xmltw.WriteStartElement("价格");
16
xmltw.WriteAttributeString("币种","人民币");/*创建属性。*/
17
xmltw.WriteString("100");
18
xmltw.WriteEndElement();
19
xmltw.WriteEndElement();
20
xmltw.WriteStartElement("书籍");
21
xmltw.WriteStartElement("书名");
22
xmltw.WriteString("你的书");
23
xmltw.WriteEndElement();
24
xmltw.WriteStartElement("作者");
25
xmltw.WriteString("你");
26
xmltw.WriteEndElement();
27
xmltw.WriteStartElement("价格");
28
xmltw.WriteAttributeString("币种", "人民币");
29
xmltw.WriteString("100");
30
xmltw.WriteEndElement();
31
xmltw.WriteEndElement();
32
xmltw.WriteEndElement();
//这是第二种方法: 2
XmlTextWriter xmltw; /*声明一个表示提供快速、非缓存、只进方法的编写器,该方法生成包含 XML 数据的流或文件。*/3
String xmlfile = Server.MapPath("my2.xml");/*建立该XML文件。*/4
xmltw = new XmlTextWriter(xmlfile,null);/*指定要写入的文件和编码方式。莫忘!*/5
xmltw.Formatting = Formatting.Indented;/*制定写入格式,此处为缩进格式。*/6
xmltw.WriteStartDocument();/*本方法创建XML声明。*/7
xmltw.WriteStartElement("目录");/*本方法创建元素。*/8
xmltw.WriteStartElement("书籍");9
xmltw.WriteStartElement("书名"); //》》》》》》》》》》10
xmltw.WriteString("我的书");// 此方法创建元素值 》 这三行代码创建了一个完整的元素包含:起始 值 结束。11
xmltw.WriteEndElement();//此方法创建元素结束标识》》》》12
xmltw.WriteStartElement("作者");13
xmltw.WriteString("我");14
xmltw.WriteEndElement();15
xmltw.WriteStartElement("价格");16
xmltw.WriteAttributeString("币种","人民币");/*创建属性。*/17
xmltw.WriteString("100");18
xmltw.WriteEndElement();19
xmltw.WriteEndElement();20
xmltw.WriteStartElement("书籍");21
xmltw.WriteStartElement("书名");22
xmltw.WriteString("你的书");23
xmltw.WriteEndElement();24
xmltw.WriteStartElement("作者");25
xmltw.WriteString("你");26
xmltw.WriteEndElement();27
xmltw.WriteStartElement("价格");28
xmltw.WriteAttributeString("币种", "人民币");29
xmltw.WriteString("100");30
xmltw.WriteEndElement();31
xmltw.WriteEndElement();32
xmltw.WriteEndElement();33
xmltw.Close(); /*关闭流*/
这两种方法的结果(声明处ENCODING属性不一样其余一样,就上一个吧):
1
<?xml version="1.0" encoding="UTF-8"?>
2
<目录>
3
<书籍>
4
<书名>我的书</书名>
5
<作者>我</作者>
6
<价格 币种="人民币">100</价格>
7
</书籍>
8
<书籍>
9
<书名>你的书</书名>
10
<作者>你</作者>
11
<价格 币种="人民币">100</价格>
12
</书籍>
13
</目录>
<?xml version="1.0" encoding="UTF-8"?>2
<目录>3
<书籍>4
<书名>我的书</书名>5
<作者>我</作者>6
<价格 币种="人民币">100</价格>7
</书籍>8
<书籍>9
<书名>你的书</书名>10
<作者>你</作者>11
<价格 币种="人民币">100</价格>12
</书籍>13
</目录>
以上就是这两种方法。总结一下:第一种方法是以xml文件的各个节点为单位,组装起来的。它的优势在于方便构造结构。还有,不同于第二种方法的生成文件方式,他是在内存中构造好然后用 Save()方法生成。 第二种方法的特点就如在第二句注释里说的“提供快速、非缓存、只进方法的编写器” ,是编写器。就像打字机一样把XML文件以流的方式一句一句表达出来,表达的过程中就直接生成了,不同与第一种方法的生成方式。第一种方式灵活,第二种快速。
下面是一些其他的操作,包括增,删,改。代码是直接贴过来的。我真是太懒了~~
添加一个节点:
1
XmlDocument xmlDoc=new XmlDocument();
2
xmlDoc.Load(Server.MapPath("data.xml"));
3
XmlNode root=xmlDoc.SelectSingleNode("Employees");//查找<Employees>
4
XmlElement xe1=xmlDoc.CreateElement("Node");//创建一个<Node>节点
5
xe1.SetAttribute("genre","张三");//设置该节点genre属性
6
xe1.SetAttribute("ISBN","1-1111-1");//设置该节点ISBN属性
7![]()
8
XmlElement xesub1=xmlDoc.CreateElement("title");
9
xesub1.InnerText="C#入门帮助";//设置文本节点
10
xe1.AppendChild(xesub1);//添加到<Node>节点中
11
XmlElement xesub2=xmlDoc.CreateElement("author");
12
xesub2.InnerText="高手";
13
xe1.AppendChild(xesub2);
14
XmlElement xesub3=xmlDoc.CreateElement("price");
15
xesub3.InnerText="158.3";
16
xe1.AppendChild(xesub3);
17![]()
18
root.AppendChild(xe1);//添加到<Employees>节点中
19
xmlDoc.Save ( Server.MapPath("data.xml") );
20![]()
XmlDocument xmlDoc=new XmlDocument(); 2
xmlDoc.Load(Server.MapPath("data.xml")); 3
XmlNode root=xmlDoc.SelectSingleNode("Employees");//查找<Employees> 4
XmlElement xe1=xmlDoc.CreateElement("Node");//创建一个<Node>节点 5
xe1.SetAttribute("genre","张三");//设置该节点genre属性 6
xe1.SetAttribute("ISBN","1-1111-1");//设置该节点ISBN属性 7

8
XmlElement xesub1=xmlDoc.CreateElement("title"); 9
xesub1.InnerText="C#入门帮助";//设置文本节点 10
xe1.AppendChild(xesub1);//添加到<Node>节点中 11
XmlElement xesub2=xmlDoc.CreateElement("author"); 12
xesub2.InnerText="高手"; 13
xe1.AppendChild(xesub2); 14
XmlElement xesub3=xmlDoc.CreateElement("price"); 15
xesub3.InnerText="158.3"; 16
xe1.AppendChild(xesub3); 17

18
root.AppendChild(xe1);//添加到<Employees>节点中 19
xmlDoc.Save ( Server.MapPath("data.xml") );20

修改节点的值:
1
XmlDocument xmlDoc=new XmlDocument();
2
xmlDoc.Load( Server.MapPath("data.xml") );
3![]()
4
XmlNodeList nodeList=xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点
5![]()
6
foreach(XmlNode xn in nodeList)//遍历所有子节点
7
{
8
XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型,因为节点类型不能对属性操作!
9
if(xe.GetAttribute("genre")=="张三")//如果genre属性值为“张三”
10
{
11
xe.SetAttribute("genre","update张三");//则修改该属性为“update张三”
12![]()
13
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
14
foreach(XmlNode xn1 in nls)//遍历
15
{
16
XmlElement xe2=(XmlElement)xn1;//转换类型
17
if(xe2.Name=="author")//如果找到
18
{
19
xe2.InnerText="亚胜";//则修改
20
} } } }
XmlDocument xmlDoc=new XmlDocument(); 2
xmlDoc.Load( Server.MapPath("data.xml") ); 3

4
XmlNodeList nodeList=xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点 5

6
foreach(XmlNode xn in nodeList)//遍历所有子节点 7
{ 8
XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型,因为节点类型不能对属性操作! 9
if(xe.GetAttribute("genre")=="张三")//如果genre属性值为“张三” 10
{ 11
xe.SetAttribute("genre","update张三");//则修改该属性为“update张三” 12

13
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点 14
foreach(XmlNode xn1 in nls)//遍历 15
{ 16
XmlElement xe2=(XmlElement)xn1;//转换类型 17
if(xe2.Name=="author")//如果找到 18
{ 19
xe2.InnerText="亚胜";//则修改20
} } } } 21
xmlDoc.Save( Server.MapPath("data.xml") );//保存。
22
删除节点和节点属性:
1
XmlDocument xmlDoc=new XmlDocument();
2
xmlDoc.Load( Server.MapPath("data.xml") );
3
XmlNodeList xnl=xmlDoc.SelectSingleNode("Employees").ChildNodes;
4
foreach(XmlNode xn in xnl)
5
{
6
XmlElement xe=(XmlElement)xn;
7
xe.RemoveAttribute("genre");//删除genre属性
8![]()
9
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
10
foreach(XmlNode xn1 in nls)//遍历
11
{
12
XmlElement xe2=(XmlElement)xn1;//转换类型
13
if(xe2.Name=="flag")//如果找到名字是flag的节点
14
{
15
xe.RemoveChild(xe2);//则从父节点删除此节点
16
}
17
}
18
}
19
xmlDoc.Save( Server.MapPath("data.xml") );
20![]()
XmlDocument xmlDoc=new XmlDocument(); 2
xmlDoc.Load( Server.MapPath("data.xml") ); 3
XmlNodeList xnl=xmlDoc.SelectSingleNode("Employees").ChildNodes; 4
foreach(XmlNode xn in xnl) 5
{ 6
XmlElement xe=(XmlElement)xn; 7
xe.RemoveAttribute("genre");//删除genre属性 8

9
XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点 10
foreach(XmlNode xn1 in nls)//遍历 11
{ 12
XmlElement xe2=(XmlElement)xn1;//转换类型 13
if(xe2.Name=="flag")//如果找到名字是flag的节点 14
{ 15
xe.RemoveChild(xe2);//则从父节点删除此节点16
} 17
} 18
} 19
xmlDoc.Save( Server.MapPath("data.xml") ); 20

暂时就这么多吧,不是玩XML编程的。0:47:03
XmlDocument xmldoc; 
xmlnod
浙公网安备 33010602011771号