XML(Extensible Markup Language):可扩展标记语言,允许用户自定义标签(元素),在很多场合,被用作数据传递、持久化以及配置文件。
其实XML本身没具备任何行为,但是因为XML是能够被多种操作系统和应用程序识别的纯文本格式,所以在很多地方,被用作数据传输和信息交互。
XML本身的语法很简单,有一些常用的规则:
- 第一行是XML声明(必须在第一行)
- 有且仅有一个根结点
- 区分大小写
- 所有节点必须有关闭标签(自关闭也算)
- 节点之间允许包含,但是不允许交叉嵌套
- 节点中属性名称必须唯一
- 属性的值左右需要双引号
- XML中可以使用实体引用和注释<!-- -->
举个例子:
<?xml version="1.0" encoding="utf-8" ?> <books> <book isbn="1001"> <title>红楼梦</title> <author>曹雪芹</author> <price>10.99</price> <pubdate>2010-1-1</pubdate> </book> <book isbn="1002"> <title>西游记</title> <author>吴承恩</author> <price>20.99</price> <pubdate>2010-2-1</pubdate> </book> <book isbn="1003"> <title>水浒传</title> <author>施耐庵</author> <price>30.99</price> <pubdate>2010-3-1</pubdate> </book> <book isbn="1004"> <title>三国演义</title> <author>罗贯中</author> <price>40.99</price> <pubdate>2010-4-1</pubdate> </book> </books>
换一种编写方式(XML文件没有固定的编写格式)
<?xml version="1.0" encoding="utf-8" ?> <books> <book isbn="1001" title="红楼梦" author="曹雪芹" price="10.99" pubdate="2010-1-1"/> <book isbn="1002" title="西游记" author="吴承恩" price="20.99" pubdate="2010-2-1"/> <book isbn="1003" title="水浒传" author="施耐庵" price="30.99" pubdate="2010-3-1"/> <book isbn="1004" title="三国演义" author="罗贯中" price="40.99" pubdate="2010-4-1"/> </books>
对比两种XML格式,第一种更易于阅读和扩展(易于展现树状层级结构),第二种更易于代码读写(避免嵌套循环,但是对内容有要求)
保证XML格式的正确有效,可以借助于XML验证(DTD和Schema)
其中DTD验证逐渐淡出,但是还有部分场合在使用,今后的验证主要趋向于Schema验证
下面是一段DTD的验证(内部验证和外部文件验证均可,调用方式可以在互联网上查找):
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE books[ <!ELEMENT books (book*)> <!ELEMENT book (title,author,price,pubdate)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ELEMENT pubdate (#PCDATA)> <!ATTLIST book isbn CDATA #REQUIRED> ]> <books> <book isbn="1001"> <title>红楼梦</title> <author>曹雪芹</author> <price>10.99</price> <pubdate>2010-1-1</pubdate> </book> <book isbn="1002"> <title>西游记</title> <author>吴承恩</author> <price>20.99</price> <pubdate>2010-2-1</pubdate> </book> <book isbn="1003"> <title>水浒传</title> <author>施耐庵</author> <price>30.99</price> <pubdate>2010-3-1</pubdate> </book> <book isbn="1004"> <title>三国演义</title> <author>罗贯中</author> <price>40.99</price> <pubdate>2010-4-1</pubdate> </book> </books>
Schema验证本身也是XML文件,所以扩展性,阅读性更强,同时支持数据类型和命名空间,重要的是,允许通过VS等工具,反向生成验证文档(在菜单XML中,选择创建架构),如:
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="http://www.rammderek.com/bookList.xsd"elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="books"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="book"> <xs:complexType> <xs:attribute name="isbn" type="xs:unsignedShort" use="required" /> <xs:attribute name="title" type="xs:string" use="required" /> <xs:attribute name="author" type="xs:string" use="required" /> <xs:attribute name="price" type="xs:decimal" use="required" /> <xs:attribute name="pubdate" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
对应的XML文件需要追加验证属性
<?xml version="1.0" encoding="utf-8" ?> <books xmlns="http://www.rammderek.com/bookList.xsd"> <book isbn="1001" title="红楼梦" author="曹雪芹" price="10.99" pubdate="2010-1-1"/> <book isbn="1002" title="西游记" author="吴承恩" price="20.99" pubdate="2010-2-1"/> <book isbn="1003" title="水浒传" author="施耐庵" price="30.99" pubdate="2010-3-1"/> <book isbn="1004" title="三国演义" author="罗贯中" price="40.99" pubdate="2010-4-1"/> </books>
通过Schema验证,还能够帮助我们在编写XML文档的时候,调用智能提示,有关Schema验证的语法,参见文档
有关XML的显示,可以使用CSS或者XSLT,其中XSLT的使用更为常见
首先编写CSS样式表:Books.css
books { display: block; } book { display: block; margin: 10px; border-bottom: 1px dotted darkcyan; } title { display: block; font-size: 24px; color: darkblue; } author { color: lightblue; } price { color: darkgreen; font-style: italic; } pubdate { color: red; }
关联CSS样式的XML文件,需要加入样式引用,如下:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE books[ <!ELEMENT books (book*)> <!ELEMENT book (title,author,price,pubdate)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ELEMENT pubdate (#PCDATA)> <!ATTLIST book isbn CDATA #REQUIRED> ]> <?xml-stylesheet type="text/css" href="Books.css"?> <books> <book isbn="1001"> <title>红楼梦</title> <author>曹雪芹</author> <price>10.99</price> <pubdate>2010-1-1</pubdate> </book> <book isbn="1002"> <title>西游记</title> <author>吴承恩</author> <price>20.99</price> <pubdate>2010-2-1</pubdate> </book> <book isbn="1003"> <title>水浒传</title> <author>施耐庵</author> <price>30.99</price> <pubdate>2010-3-1</pubdate> </book> <book isbn="1004"> <title>三国演义</title> <author>罗贯中</author> <price>40.99</price> <pubdate>2010-4-1</pubdate> </book> </books>
最终XML文件在浏览器中的显示效果
XSLT样式,有点像JSTL,内置了循环、判断、取值等标签:
<xsl:template match=“/”>
<xsl:for-each>
<xsl:value-of>
<xsl:sort>
<xsl:if>
<xsl:choose>
下面的代码是一个简单的XSLT文件,用于获取XML的内容,并动态生成HTML格式的页面:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Book List</title> </head> <body> <table border="1"> <tr> <td>标题</td> <td>作者</td> <td>价格</td> <td>日期</td> </tr> <xsl:for-each select="books/book"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="author"/></td> <td><xsl:value-of select="price"/></td> <td><xsl:value-of select="pubdate"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
对应的XML文件也需要加入XSLT文件的样式引用
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE books[ <!ELEMENT books (book*)> <!ELEMENT book (title,author,price,pubdate)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ELEMENT pubdate (#PCDATA)> <!ATTLIST book isbn CDATA #REQUIRED> ]> <?xml-stylesheet type="text/xsl" href="Books.xslt"?> <books> <book isbn="1001"> <title>红楼梦</title> <author>曹雪芹</author> <price>10.99</price> <pubdate>2010-1-1</pubdate> </book> <book isbn="1002"> <title>西游记</title> <author>吴承恩</author> <price>20.99</price> <pubdate>2010-2-1</pubdate> </book> <book isbn="1003"> <title>水浒传</title> <author>施耐庵</author> <price>30.99</price> <pubdate>2010-3-1</pubdate> </book> <book isbn="1004"> <title>三国演义</title> <author>罗贯中</author> <price>40.99</price> <pubdate>2010-4-1</pubdate> </book> </books>
最终浏览器显示的XML文件效果