码迷,mamicode.com
首页 > 其他好文 > 详细

XML文档

时间:2015-01-22 00:14:45      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

XML(Extensible Markup Language):可扩展标记语言,允许用户自定义标签(元素),在很多场合,被用作数据传递、持久化以及配置文件。

其实XML本身没具备任何行为,但是因为XML是能够被多种操作系统和应用程序识别的纯文本格式,所以在很多地方,被用作数据传输和信息交互。

XML本身的语法很简单,有一些常用的规则:

  1. 第一行是XML声明(必须在第一行)
  2. 有且仅有一个根结点
  3. 区分大小写
  4. 所有节点必须有关闭标签(自关闭也算)
  5. 节点之间允许包含,但是不允许交叉嵌套
  6. 节点中属性名称必须唯一
  7. 属性的值左右需要双引号
  8. 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文件效果

技术分享

XML文档

标签:

原文地址:http://www.cnblogs.com/rammderek/p/4240409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!