XML 全面总结
XML专用名词:
XML: XML即可扩展标记语言,Extensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等
DTD: 是一种保证XML文档格式正确的有效方法,可以比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确
Schema: XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD
DOM: document object model 文档对象模型
SAX: Simple APIs for XML,也即XML简单应用程序接口。它是XML_DEV邮件列表中的成员根据应用的需求自发地定义的一套对XML文档进行操作的接口规范
SAX是顺序的,层次化的分析XML文档,着眼于当前的事件连续的处理,不是全部文档都读入内存
DOM的做法正是将XML文档元素全部读入内存,生成一棵包含全部内容的树,以便全局的控制各个节点元素
XSLT:一种用于转换 XML 文档的语言
XPath:一种用于在 XML 文档中导航的语言。
XSL-FO:一种用于格式化 XML 文档的语言
DTD和Schema的说明:
<?xml version="1.0"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
DTD的定义如下:
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
Schema的定义如下:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
引用DTD:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.aa.com/dtd/note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
引用Schema:
<?xml version="1.0"?>
<note xmlns="http://www.aa.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.aa.com note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
XML语法:
1 只有一个根元素
2 注释用<!-- -->表示
3 属性值用双引号或单引号分隔
4 区分大小写字母
XML 与 HTML 的主要区别:
XML是区分大小写字母的,HTML不区分。
在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,绝对不能省略掉结束标记。
在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用查找结束标记了。
在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值
XML的显示可以用CSS与XSL
服务端访问XML文档
1 使用XMLTextWriter/XMLTextReader类以流的方式读写XML
写入xml文档:
构造:XmlTextWriter xml = new XmlTextWriter(Server.MapPath("~/a.xml"), Encoding.UTF8);
写入xml声明: xml.WriteStartDocument();
写入元素AA:xml.WriteStartElement("AA");
写入属性:xml.WriteAttributeString("AA_1", "aaaaaaaaaaa");
写入单元素:xml.WriteElementString("BB", "bbbbbbbbbbbbbbbb");
写入内容:xml.WriteString("AAAA");
元素结束标记:xml.WriteEndElement();
整个xml结束:xml.WriteEndDocument();
资源释放: xml.Close();
读出xml文档:
构造: XmlTextReader xml = new XmlTextReader(Server.MapPath("~/a.xml"));
读取下一行,直到结尾:xml.Read()
判断节点类型:xml.NodeType
获得节点名和值:xml.Name / xml.Value
查找元素属性:xml.MoveToNextAttribute()
资源释放: xml.Close();
2 使用XMLDocument类以DOM的方式读写XML
添加节点:
构造:XmlDocument doc = new XmlDocument();
加载:doc.Load("路径")
根节点:XmlElement root = doc.DocumentElement
创建节点:XmlElement node = doc.CreateElement("aa");
追加节点: root.AppendChild(node);
保存:doc.Save("路径")
使用XPath查询节点:
获得节点:SelectSingleNode()
XPath: 查询子节点 /根节点/子节点
查询节点属性的值 /根节点/子节点/[@属性]
查询属性值为123的节点 /节点[@属性=值]
查询第二个节点 /节点[position()=2]
查询内容为123的BB节点 /根节点[BB=123]
3 使用XmlSerializer类序列化XML
类:
[XmlRoot("AA")]
public class A
{
[XmlElement("BB")]
public string Str { get; set; }
[XmlElement("CC")]
public DateTime Time { get; set; }
}
序列化:XmlSerializer XmlSerializer ser = new XmlSerializer(typeof(类));
ser.Serialize(文件流, 对象);
反序列化: XmlSerializer ser = new XmlSerializer(typeof(类));
object obj = ser.Deserialize(文件流);
4 使用DataSet表格数据同XML的转换
从数据库写到xml :dataset.WriteXml(文件流)
从xml读出:dataset.ReadXml(xml文件)
XmlDataDocument类: 同步DataSet,使用Xpath查询DataSet
ds.EnforceConstraints = false;
XmlDataDocument doc = new XmlDataDocument(ds);
doc.Load(Server.MapPath("a.xml"));
XmlNode node = doc.SelectSingleNode("/NewDataSet/emp[employeeid=2]");
Response.Write(node.LastChild.InnerText);