妙用XML实体引用
来源:互联网 发布:手机订车票软件 编辑:程序博客网 时间:2024/05/21 22:47
转载自:http://blog.sina.com.cn/s/blog_605f5b4f0100ir4c.html
看到实体引用还能这么用,学习了一波,转载一下,方便以后查看。
感谢原作者的分享。
XML的实体引用
先看xml的文档结构:
1,XML声明
xml文档是由一组使用唯一名称标识的实体组成的。始终以一个声明开始,这个声明指定该文档遵循XML1.0的规范。XML也有一种逻辑结构,在逻辑上,文档的组成成部分包括声明,元素,注释,字符引用和处理指令。
以下是代码片段:
<?xml version="1.0" ?>
这个就是XML的声明,声明也是处理指令,在XML中,所有的处理指令都以<?
开始,?>
结束。<?
后面紧跟的是处理指令的名称。XML处理指令要求指定一个version属性。并允许指定可选的standalone和encodeing,其中standalone是指是否允许使用外部声明,可设置为yes或no。yes是指定不使用外部声明。no为使用。encodeing是指作者使用的字符编码格式。有UTF-8,GBK,gb2312等等。
2,根元素
每个XML文件都必须有且只能有一个根元素。用于描述文档功能。可以自定义根元素。下例中的root为根元素。 以下是代码片段:
<root>...................</root>
3,XML代码
根据应用需要创建自定义的元素和属性。标签包括尖括号以及尖括号中的文本。元素是XML内容的基本单元。元素包括了开始标签、结束标签和标签之间的内容。
以下是代码片段:
<title>XML是可扩展标记语言</title>
整行统称为元素,其中<title></title>
为标签,XML是可扩展标记语言是字符数据
XML的标记有:标签,注释,处理指令,DTD和引用等。
4,注释
在XML中,注释与HTML的一样,都是用<!-- 注释 -->
指定注释。要遵循以下规则:
在注释中不应包含有“-”“—”等字符,以免XML解释器产生混淆。
注释不能放在标签中
注释不能写在第一行。第一行是XML声明。
注释不能嵌套
可跨行注释,与java中的注释块功能一样。
5,处理指令
凡是以<?
开始,?>
结束的都是处理指令。XML声明就是一个处理指令。
标签间的字符数据的分类
标签间的字符数据可以是除了<
以外的任何合法(Unicode)字符。<
字符是预留作为标签的开始字符。字符数据分以下两类:
PCDATA(是指将要通过解析器进行解析的文本)
CDATA (是指不要通过解析器进行解析的文本)
其中不允许中CDATA块之内使用字符串“]]>”,因为它表示CDATA块的结束。
6,实体
实体可以是常用的短语,键盘字符,文件,数据库记录或任何包含数据的项。在XML中,有时实体内包含了些字符,如&
,<
,>
,"
,'
等。这些均需要对其进行转义,否则会对XML解释器生成错误。
字符
转义后字符
&
&
<
<
>
>
'
'
"
"
在XML中出现以上字符的,均需要转义才能通过。
实体格式如下: 以下是代码片段: <!ENTITY 实体引用名 "引用内容">
实体又分两类:
1,一般实体(格式:&实体引用名;)
2,参数实体(格式:%实体引用名;)
一般实体,可以在XML文档中的任何位置出现的实体称为一般实体。实体可以声明为内部实体还是外部实体。外部实体分SYSYTEM及PUBLIC两种。SYSYTEM引用本地计算机,PUBLIC引用公共计算机,外部实体格式如下: <!ENTITY 引用名 SYSTEM(PUBLIC) "URI地址">
管理实体引用的规则包括:
引用实体前,必须先在XML文档中声明该实体。
实体引用不应含有任空空格。例如:& title;
&title ;
都是不对的。
实体引用的XML文件必须是格式良好的。
实体引用可以替代常规字符数据,也可以在标签属性中使用实体引用。如
<title value="&title" />
DOCTYPE声明
在XML文档中,<!DOCTYPE[...]>
声明跟在XML声明的后面。实体也必须在DOCTYPE声明中声明。语法如下:
以下是代码片段:
<?xml version="1.0" unicode="UTF-8"><!DOCTYPE[.....在此声明实体<!ENTITY 实体引用名 "引用内容">]>
代码例子:
以下是代码片段:
<?xml version="1.0" encoding="GBK"?><!DOCTYPE root[ <!ENTITY titlue "引用字符1"> <!ENTITY titlue2 "引用字符2">]><root> <title value="&titlue;"> &titlue; </title> <title2> <value><a>&titlue2;</a></value> </title2></root>
在IE是打开XML文件显示为:
以下是代码片段:
<?xml version="1.0" encoding="GBK" ?><!DOCTYPE root (View Source for full doctype...)>- <root><title value="引用字符1">引用字符1</title>- <title2>- <value><a>引用字符2</a></value>
合并多个XML文件的简单方法 —— 外部实体引用
下面的例子通过外部实体引用,将文件order1.xml与文件order2.xml合并为一个文件directory.xml
清单1. 要合并的xml文档order1.xml:
<?xml version="1.0" encoding="GB2312"?><order> <item> <itemNumber>ksu-0384</itemNumber> <description>LCD液晶显示器</description> <quantity>1</quantity> <price>358.00</price> </item> <item> <itemNumber>ksu-0511</itemNumber> <description>音箱</description> <quantity>1</quantity> <price>16.50</price> </item> <item> <itemNumber>ksu-7710</itemNumber> <description>鼠标</description> <quantity>1</quantity> <price>8.50</price> </item></order>
清单2. 要合并的xml文档order2.xml:
<?xml version="1.0" encoding="GB2312"?><order> <item> <itemNumber>ksu-0652</itemNumber> <description>双飞燕键盘</description> <quantity>1</quantity> <price>35.00</price> </item> <item> <itemNumber>ksu-7720</itemNumber> <description>intel CPU</description> <quantity>1</quantity> <price>1650.00</price> </item> <item> <itemNumber>ksu-7010</itemNumber> <description>迈拓硬盘</description> <quantity>1</quantity> <price>850.00</price> </item></order>
清单3. 输出文档directory.xml,黑体字部分为实体声明及其引用:
<?xml version="1.0"?><!DOCTYPE directory [ <!ENTITY disclaimer1 SYSTEM "./order1.xml"> <!ENTITY disclaimer2 SYSTEM "./order2.xml">]><directory> &disclaimer1; &disclaimer2;</directory>
当符合 XML 1.0 的处理器读取文档时,就会扩展实体,用它的内容代替引用,因此完整的文档如下所示。
清单4. 带有扩展实体的文档显示(IE6中):
<?xml version="1.0" ?> <!DOCTYPE directory (View Source for full doctype...)>- <directory> - <order> - <item> <itemNumber>ksu-0384</itemNumber> <description>LCD液晶显示器</description> <quantity>1</quantity> <price>358.00</price> </item> - <item> <itemNumber>ksu-0511</itemNumber> <description>音箱</description> <quantity>1</quantity> <price>16.50</price> </item> - <item> <itemNumber>ksu-7710</itemNumber> <description>鼠标</description> <quantity>1</quantity> <price>8.50</price> </item> </order> - <order> - <item> <itemNumber>ksu-0652</itemNumber> <description>双飞燕键盘</description> <quantity>1</quantity> <price>35.00</price> </item> - <item> <itemNumber>ksu-7720</itemNumber> <description>intel CPU</description> <quantity>1</quantity> <price>1650.00</price> </item> - <item> <itemNumber>ksu-7010</itemNumber> <description>迈拓硬盘</description> <quantity>1</quantity> <price>850.00</price> </item> </order> </directory>
解析外部实体引用的简单方法
SAX 定义了一个接口 org.xml.sax.EntityResolver
,它提供的功能就是您要的功能。这个接口只定义了一个方法,如“清单 1”中所示:
清单 1. SAX EntityResolver 接口
java
package org.xml.sax;
public interface EntityResolver {
public InputSource resolveEntity(String publicID, String systemID) throws SAXException;
}
这个接口中的唯一方法 resolveEntity()
提供了一种开始实体解析进程的方法。由于每个外部实体引用在指定如何解析内容的 DTD 中都有一个公共标识或一个系统标识,或同时拥有这两者,所以可以在这个方法中匹配它们并实现自己的行为。例如,认为“清单 2”中的 DTD 部分定义了 copyright
外部实体引用:
清单 2. DTD 中定义的 copyright 外部实体引用
xml
<!ENTITY copyright SYSTEM "http://www.ibm.com/developerworks/copyright.xml">
这里,没有公共标识,系统标识是 http://www.ibm.com/developerworks/copyright.xml
。所以,可以创建一个名为 CopyrightEntityResolver
的类,如“清单 3”中所示。
清单 3. 实现 EntityResolver
java
package com.ibm.developerWorks;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class CopyrightResolver implements EntityResolver {
public InputSource resolveEntity(String publicID, String systemID) throws SAXException {
if (systemID.equals("http://www.ibm.com/developerworks/copyright.xml")) {
// Return local copy of the copyright.xml file
return new InputSource("/usr/local/content/localCopyright.xml");
}
// If no match, returning null makes process continue normally
return null;
}
在这个简单的实现中,在每次解析实体时都会调用 resolveEntity()
方法。如果实体的系统标识匹配该方法中的 URL, 则返回本地的 XML 文档 ( localCopyright.xml
); 而不是返回位于提供的系统标识处的任何资源。使用这种方法,可以“缩短”处理进程,并向给定的公共标识或系统标识提供您自己的数据。当不匹配时,您会希望始终确保返回 null
,这样实体解析在非特殊情况下都可以正常进行。
以上就是对实体引用解析的介绍。您可以将实体解析器注册在分析器上,如“清单 4”中所示。
清单 4. 实现 EntityResolver
java
// Get an XML Reader - this code not detailed here
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setEntityResolver(new CopyrightResolver());
reader.parse(new InputSource("article.xml"));
这就行了。如果可以获取实体引用内容的本地副本,或者需要用自己的内容替代实体引用,请使用 SAXEntityResolver
接口。这将有助于提高应用程序的速度并增加 XML 文档的灵活性。
引用:
http://hi.baidu.com/dljaye/blog/item/198fe1735488a9108701b0a8.html
http://blog.csdn.net/ksu99/archive/2004/11/10/175866.aspx
http://www.ibm.com/developerworks/cn/xml/tips/x-tipent/
- 妙用XML实体引用
- XML 实体引用
- XML 实体引用
- XML的实体引用
- .xml外部实体引用
- XML中的实体引用符
- XML字符和实体引用
- xml内部实体的引用
- XML CDATA和实体引用
- xml解析中的实体引用
- XML中预定义的实体引用
- xml中的实体引用(<和&)
- XML 实体引用、注释、命名规则
- XML保留字符的实体引用
- xml五个预定义的实体引用
- 引用妙用
- XML文档中的字符引用和实体引用
- 实体引用
- Android自动化大讲堂36--UIAutomator测试项目创建
- Android自动化大讲堂37--UIAutomator API详解之给力的手势
- Android自动化大讲堂34--终极自动化框架UIAutomator使用详解
- Android自动化大讲堂31--Instrumentation捕获项目控件
- 5.虚拟机性能监控与故障处理工具
- 妙用XML实体引用
- 编译UPX加壳工具
- zTree ctrl 多选功能
- 大数据之:影像提取中深度学习样本库获取的思考
- Mybatis初步
- 左边多级导航切换右边的main
- Android源码中学习文档如何查看
- Android自动化大讲堂32--Instrumentation对项目的自动化测试
- Android自动化大讲堂35--UIAutomator控件捕获