一、XML基础知识
1 XML (Extensible Markup language) 可扩展性标记语言! 先说这个可扩展性,大家都知道,html标签是不允许我们自定义的,<a>,<br>等等,都是已经成为规则,不能更改!但是,XML里面的标签是允许我们自定义的~!这就是他的可扩展性。
2 XML是什么?XML是以一种简单的文本格式存放数据的方式,这也说明了,他可以被任何计算机读取。
3 XML文档:XML中完整的数据集就是XML文档。XML文档最重要的是XML元素,XML元素包含了XML属性(特性)。
4 XML文档的要求: 1) 有且只有一个根元素 2)每一个元素都有一个结束标记 3)没有重叠的元素-------所有的元素都必须完全嵌套在父元素内,元素不能交叉! 4)所有的属性必须放在括号内!
5:节点 XML文档的各个部分称为节点,因此,元素(XmlElement类),特性(XmlAttribute类),元素内的文本(XmlText类)都是节点。这三种节点都派生于XmlNode节点。
6 <?xml version="1.0"?> 是XML的声明格式。元素的名称一直都是xml ,并且必须拥有特性 version。特性只能使用1.0
7 XML的元素区分大小下。html中 <br>和<BR>是一样的。但是在XML中<book>和<BOOK>绝对不是同一个东西!
下面看一下一个XML文档(xmlTest.xml)
<?xml version="1.0"?> <books> <book> <title>Beginning Visual C# 4.0 </title> <author>Karli Watson</author> <code>7582</code> </book> <book> <title>Professional C# 2nd Edition 4.0 </title> <author>Simon Robinson</author> <code>7043</code> </book> </books>
二、XML内容的读取
XML的DOM(Document Object Model)文本对象模型。这里的DOM和javascript里html对应的DOM一样(把HTML结构描述为一棵树)。我们对XML文档进行操作,也是通过DOM进行的!.net为我们提供了DOM类库,他们在System.XML名称空间里。接下来,分别介绍他们常用的几个类!
XmlNode类:表示了一个节点,在摸种程度上,可以认为他的作用相似C#类库里面的Object类,就是说,是别的XML类的父类。
XmlDocument类:表示了XML文档对象。
XmlElement类:其对象表示了元素的节点。
XmlAttribute类:其对象表示了特性节点。
XmlText类:其对象表示了文本节点。
他们的一些属性:ChildNodes :返回该节点的所有子节点
ParentsNode :返回该节点的父节点
FirstChild :返回该节点的第一个子节点
LastChild :返回该节点的最后一个子节点
HasChildNodes:判断该节点是否有子节点。
NextSibling :返回与该节点具有相同父节点的下一个兄弟节点。
name :节点的名字
innerText :以一个字符串的形式,返回这个节点的所有子节点的文本。
innerXML :类似于innerText
value :返回节点的值,一般只有XmlAttribute和XmlText里面有!
现在我用C#控制台程序读取上面的那个xmlTest.xml文档的所有内容
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using System.Threading; using System.IO; using ConsoleApplication4; using System.Xml; namespace XMLTest { public class XmlTest { static void Main(string[] args) { XmlDocument xd = new XmlDocument(); xd.Load(@"E:\学习\ConsoleApplication4\ConsoleApplication4\XMLTest.xml"); XmlElement xe = xd.DocumentElement; getContext(xe as XmlNode); Console.Read(); } public static void getContext(XmlNode xn) { if(xn is XmlText) { Console.WriteLine(xn.Value); } if (xn.HasChildNodes) { foreach(XmlNode xn1 in xn.ChildNodes ) { getContext(xn1); } } else { return; } } } }
结果:
如果我想只读取其中个别元素节点的内容呢?比如我只想读取<title></title>里面标题的内容。可以这样:
namespace XMLTest { public class XmlTest { static void Main(string[] args) { XmlDocument xd = new XmlDocument(); xd.Load(@"E:\学习\ConsoleApplication4\ConsoleApplication4\XMLTest.xml"); XmlElement xe = xd.DocumentElement; getContext(xe as XmlNode); Console.Read(); } public static void getContext(XmlNode xn) { if(xn is XmlText) { if(xn.ParentNode.Name=="title") Console.WriteLine(xn.Value); } if (xn.HasChildNodes) { foreach(XmlNode xn1 in xn.ChildNodes ) { if (xn1 is XmlElement) { if(xn1.Name=="title") { Console.Write(xn1.Name+":"); } } getContext(xn1); } } else { return; } } } }
结果:
其实还有别的更简单的方法!
使用XmlNodeList类:XmlNodeList,看它的样子,就知道是个集合,对,就是一些节点的集合!
使用这个类,需要使用XPath的内容,XPath是XML的查询语言!就像SQL是数据库的查询语言一样。以后再说吧!
三、XML节点值得修改
原理:找到目的节点------->修改其内容---------->使用XmlDocument的Save(“路径”)方法保存,这就行了。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using System.Threading; using System.IO; using System.Xml; namespace XMLTest { public class XmlTest { static void Main(string[] args) { XmlDocument xd = new XmlDocument(); xd.Load(@"E:\学习\ConsoleApplication4\ConsoleApplication4\XMLTest.xml"); XmlElement xe = xd.DocumentElement; getContext(xe as XmlNode); xd.Save(@"E:\学习\ConsoleApplication4\ConsoleApplication4\XMLTest.xml");//再一次强调 ,一定要记得保存的该XML文件 Console.Read(); } public static void getContext(XmlNode xn) { if (xn is XmlText) { if (xn.Value == "7582") { xn.Value = "0000"; //修改节点的内容! } } if (xn.HasChildNodes) { foreach (XmlNode xn1 in xn.ChildNodes) { getContext(xn1); } } else { return; } } } }