`
wansong
  • 浏览: 20905 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

管理 XML 数据: XML 编目

阅读更多
From "http://www.ibm.com/developerworks/cn/xml/x-mxd3.html"

管理 XML 数据: XML 编目
间接样式表、DTD 和模式
  Elliotte Rusty Harold (elharo@metalab.unc.edu), 副教授, Polytechnic University


2005 年 6 月 30 日

一条老的程序员谚语说,通过增加间接层任何问题都能解决。这一谚语同样适用于 XML。加载模式、 DTD 和样式表出现的很多问题,都可以通过引入 XML 编目作为解析器和网络加载程序之间的间接层得到完美的解决。XML 编目允许文档消费者用一组 URL 替换 XML 文档自身中规定的实际 URL 或者公共标识符。这样可以提高 XML 处理的速度和安全性。
很多 XML 文档包含定位样式表、模式和 DTD 等的相对 URL。如果是绝对 URL,它们也可能指向隐藏在防火墙背后的系统。即使这些 URL 是可访问的,出于性能的考虑也可能需要使用本地缓存,而不是反复地绕过半个地球从同一个远程网络服务器上下载相同的 DTD。

比如 IBM developerWorks 站点使用的 XML 模板,其开头是这样的:

<?xml version="1.0"?>
<?xml-stylesheet type="application/xml+xslt" href="
C:\IBM developerWorks\article-author-package\developerworks\xsl\dw-document-html-4.0.xsl"
?>
<dw-document xsi:noNamespaceSchemaLocation=
"C:\IBM developerWorks\article-author-package\developerworks\schema\dw-document-4.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


注意其中对 C:\IBM developerWorks\article-author-package\developerworks\xsl 目录中的样式表和 C:\IBM developerWorks\article-author-package\developerworks\schema 目录中的模式的引用。这些是 Microsoft® Windows® 操作系统中的路径名。我在 Mac 机器上撰写文章,将这些文件保存在不同的位置。因此,撰写文章之前首先要修改这些 URL 指向我的文件系统:

<?xml-stylesheet type=" application/xml+xslt "
href="../developerWorks/xsl/dw-document-html-4.0.xsl" ?>
<dw-document
  xsi:noNamespaceSchemaLocation=
  "../developerWorks/schema/dw-document-4.0.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


完成文章的第一稿之后,我将其发送给编辑。因为她的机器运行 Windows,处理这篇文章之前,她必须修改这些 URL,使其指向新的样式表和模式位置。她编辑完后将稿件返回来让我处理她提出的质疑,我又将所有的 URL 改回来。然后我将修改后的稿件返回给她,她将文章转发给 developerWorks 的产品组,产品组还要将这些 URL 修改到第三个地址。这个过程不仅仅是一般的效率低。

通过维护一个标准 URL 和系统标识符列表并将其映射到特定位置的副本,XML 编目可以解决这个问题。每个用户都可以将通用文件(如模式、DTD 和样式表)保存在不同的地方,只要他修改本地编目文件和保存的位置匹配即可。当解析器、样式表处理程序、模式验证器或其他工具读取文档时,它就可以从编目而非文档本身中的 URL 加载辅助文件。

除了简化作者和编辑的工作外,编目还有几方面的优点。比方说,假设您正从一个远程网站(比如 www.w3.org)读取 XHTML 文档。这类文档通常包含这样的 DTD:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


如果解析器读取 DTD,不仅必须从远程 Web 服务器加载 XML 文档,还必须从有可能更远的 http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd 读取 DTD。网络速度和延迟成为关键。使用编目可以要求解析器加载同一 DTD 的本地副本,速度要快得多。

URL 重定向还可以抵抗某些攻击。比如,向您的系统提供 XML 文档的某个人可以改变外部 DTD 子集的系统标识符,从而改变验证的 DTD。编目让解析文档的用户选择使用的 DTD,而不是编辑文档的人来选择。但是这种重定向不能提供完全的保护,因为少数攻击可能使用内部 DTD 子集作为向量,而编目并不影响内部 DTD。

除了简单的缓存功能外,编目还可以替换 DTD 或者模式。比如,您可能希望使用 XHTML DTD 的某种变体,它只定义了实体而没有声明任何元素或属性。即使从本地系统加载完整的 DTD,这种 DTD 解析和应用起来也要快得多。通过修改特定属性的 ATTLIST 声明还可以改变默认属性值。无论基于什么原因选择编目,结果都是一样的:编目让阅读文档的人而非编辑文档的人负责 DTD(或者模式、样式表)。

编目的语法

清单 1 显示了一个简单的编目。编目本身是一个 XML 文档。根元素是 urn:oasis:names:tc:entity:xmlns:xml:catalog 名称空间中的 catalog。这个编目包含三个 public 元素,每一个都从特定的公共标志符映射到特定的 URL。比如,公共标志符 ID -//W3C//DTD XHTML 1.0 Strict//EN 被映射到了 URL file:///opt/xml/xhtml/DTD/xhtml1-strict.dtd。


清单 1. 用于 XHTML 的简单编目
<?xml version='1.0'?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <public publicId="-//W3C//DTD XHTML 1.0 Transitional//EN"
          uri="file:///opt/xml/xhtml/DTD/xhtml1-transitional.dtd "/>
  <public publicId="-//W3C//DTD XHTML 1.0 Strict//EN"
          uri="file:///opt/xml/xhtml/DTD/xhtml1-strict.dtd "/>
  <public publicId="-//W3C//DTD XHTML 1.0 Frameset//EN"
          uri="file:///opt/xml/xhtml/DTD/xhtml1-frameset.dtd "/>
</catalog>


假设用该编目配置的解析器读取开头如下所示的文档:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


就不需要进行第二次网络连接从 http://www.w3.org 下载 DTD。相反,是从路径 /opt/xml/xhtml/DTD/xhtml1-strict.dtd 处的本地文件系统进行下载。

当然,编目也可以重定向到 http URL 或者相对 URL。比如,可以引用本地网络服务器而非远程服务器上的 DTD 副本,或者引用与源文档位于同一目录的 DTD。

编目可允许使用带有 systemId 属性的 system 元素来重新映射系统标识符,而不是使用带有 publicId 属性的 public 元素。这种重映射可能对仅供系统标识符引用而公共标志符不引用的 DTD 和实体定义很有用,清单 2 显示了如何使用重映射来根据 W3C 站点 URL 而非公共标志符加载 XHTML DTD 的本地副本。(清单 2 实际上只是为了举例说明,公共标志符通常更为可靠。)


清单 2. XHTML 基于系统标识符的编目
<?xml version='1.0'?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
          uri="file:///opt/xml/xhtml/DTD/xhtml1-transitional.dtd "/>
  <system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
          uri="file:///opt/xml/xhtml/DTD/xhtml1-strict.dtd "/>
  <system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"
          uri="file:///opt/xml/xhtml/DTD/xhtml1-frameset.dtd "/>
</catalog>


对于一般不通过系统或公共标志符引用的样式表和其他文件,可以使用 uri 元素。该元素的 name 属性指定了映射自 的 URI。uri 属性规定了映射到 的 URI。清单 3 说明了如何将对 http://schemas.xmlsoap.org/wsdl/soap/ 的请求重定向到 http://localhost:8888/schemas/soap.xsd。


清单 3. 从本地 Web 服务器上加载 SOAP 模式
<?xml version='1.0'?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <uri name="http://schemas.xmlsoap.org/wsdl/soap/"
       uri="http://localhost:8888/schemas/soap.xsd "/>
</catalog>


编目对于改写整个 URL 树很有用。rewriteSystem 和 rewriteURI 元素为来自特定服务器或目录中的所有文件指定了替代位置。 清单 4 说明了如何将对 http://www.example.com/data/ 目录中文件的请求重定向到 http://www.example.net/mirror/。


清单 4. 改写 URI 的代码
<?xml version='1.0'?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <rewriteURI uriStartString=" http://www.example.com/data/"
rewritePrefix=" http://www.example.net/mirror/ "/>
</catalog>


比方说,如果解析器是用该编目请求文件 http://www.example.com/data/tic/article.xsl,那么实际上得到的文件是 http://www.example.net/mirror/tic/article.xsl。改写以前缀为基础,而且仅限于前缀。因此不能,比方说,使用 rewriteURI 将所有 html 文件请求重定向到 .xhtml 文件请求。

系统标识符与 URI

同时拥有 uri 和 system 元素或者 rewriteURI 和 rewriteSystem 元素,似乎有点奇怪。实际上,所有的系统标识符都是 URI,从来没有一种结构同时包含 URI 和系统标识符。system 和 rewriteSystem 元素仅用于那些在 XML 1.0 规范中定义为系统标识符的事物,主要是文档类型声明和外部实体定义中使用的 URI。uri 和 rewriteURI 元素用于其他一切事物。


虽然我用单独的编目文件示范了每个元素,但是可以将所有这些都放在一个编目中。如果同一标识符有多个映射,则位置靠前的优先。如果一个资源有多个标识符(比如,同时有公共标识符和系统标识符的 DTD),在行为取决于系统,虽然可以在编目元素中使用 prefer="system" 或 prefer="public" 属性表明应该选择哪一个。

编目还有几个更高级的特性可用于更复杂的重定向,其中包括:

用于相对 URL 解析的 xml:base 属性
用于为特殊类型的公共和系统标识符加载附加编目的 delegatePublic 和 delegateSystem 元素
用于将多个编目串在一起的 nextCatalog 元素
用于组合多个实体 group 元素
由文档序言中的 <?oasis-xml-catalog?> 处理指令指定的文档专用编目
不过,public、system、rewriteSystem、uri 和 rewriteURI 足以应付最常见的情况。






回页首




编目软件

大量 XML 软件已经内置了对 XML 编目的支持。比如,Gnome Project 中的 libxml C 库自动加载 /etc/xml/catalog 中的编目。通过在 $XML_CATALOG_FILES 环境变量中指定新的位置可以改变查找编目的目录。如果不愿意加载任何编目,可以将 $XML_CATALOG_FILES 设为空字符串。

如果程序是用 Java™ 语言编写的,并使用 SAX 解析器读取 XML,那么可以安装 Norm Walsh 的编目筛选程序(现在属于 Apache XML Commons Project)作为 EntityResolver。类似地,TrAX URIResolver 可用于解析 XSLT 样式表 xsl:import 和 xsl:include 元素以及 document() 函数中的 URL。比如,下面的代码配置 SAX 解析器使用编目:

EntityResolver resolver = new org.apache.xml.resolver.tools.CatalogResolver();
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setEntityResolver(resolver);


CatalogResolver 对象参阅 xml.catalog.files Java 系统属性以寻找编目。该属性包含分号分隔的编目文件 URI 列表。

Apache Forrest 文档框架和 Apache Cocoon Web 发布框架都使用这个 XML Commons CatalogResolver 类和编目文件来挑选出所服务的文档中的链接。

针对其他主要工具、库和环境也存在类似的选项。如何加载编目文件请参阅相关文档。虽然激活编目支持的细节因不同的工具和库而异,但编目格式都是一致的。






回页首




结束语

世界永远不会统一到单一的文件布局结构。XML 文档在系统间的移动破坏了到样式表、模式、DTD 和其他元内容的链接。XML 编目提供了一个有用的间接层次,即使文件不在文档所期望的位置也能够保持链接的完整性。只要希望保持 XML 文档及其辅助文件在异构系统中的同步,而不是简单的镜像拷贝,编目就能起到非凡的作用。通过加载本地缓存的副本而不是远程网络资源,编目还可以提高 XML 处理的速度。最后,通过避免交换 DTD 和防止 XML 解析器绕过防火墙,编目还可以改进安全性。因为您使用的很多工具可能已经内置了对编目的支持,所以编目很容易解决很多困难的问题。


分享到:
评论

相关推荐

    Beginning XML with C# 7:XML Processing and Data Access, 2nd Edition

    本文档是一本名为《Beginning XML with C# 7:XML Processing and Data Access, 2nd Edition》(《C# 7与XML入门:XML处理和数据访问第二版》)的书籍的部分内容。该书是由Bipin Joshi所著,出版社为Apress,出版于...

    Beginning.XML.4th.Edition.May.2007(PDF)

    XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,它具有自我描述性质和可扩展性。...通过学习这本书,读者可以掌握XML的核心概念,进一步深入到XML的高级应用中,如数据交换、内容管理、网络服务等。

    分布式智能编目.pdf

    分布式智能编目系统的总架构设计是基于云计算平台而构建的一个智能编目系统,它涉及到多种技术,包括分布式计算、智能任务分配、系统集成、数据管理等。通过这个架构,系统能够高效、智能地进行数据编目任务,并通过...

    XML应用开发(软件品牌)-1期 第3单元 单元案例-使用XML Schema定义描述图书馆藏书信息的XML标签.doc

    总结来说,这个案例主要涉及XML Schema的使用,通过定义一系列描述图书馆藏书信息的XML标签,实现对图书数据的有效组织和规范化,以满足信息管理和交换的需求。这在计算机科学,尤其是XML相关的软件开发中,是一个...

    通用管理框架正式版1.1源码

    发送/接收消息模块的数据层,业务逻辑层,表现层和js代码的编写,根据最新需求修改编目参数模块 调整新数据结构和默认数据到测试服务器,上传新功能模块部分到测试服务器,外借参数设置模块数据层,逻辑层和表现层以及js...

    Java项目:情缘图书馆管理系统(java+SSM+Tomcat+Maven+mysql)

    图书编目管理:图书编目、编目维护; 图书信息管理:图书录入、图书信息; 图书借阅管理:借阅图书、借阅信息、归还、续借; 读者管理:办证、读者信息、读者类别、证件操作; 系统管理:权限信息、用户权限; ``` ...

    电信设备-信息表示的编目.zip

    在电信行业中,信息表示的编目是一项至关重要的工作,它涉及到如何有效地组织、管理和传递大量复杂的数据和信息。"电信设备-信息表示的编目.zip"这个压缩包包含了一个名为"信息表示的编目.pdf"的文件,我们可以推测...

    专题资料(2021-2022年)3、《广播电视音像资料编目规范电视资料部分》标准设计及应用说明.doc

    该规范的制定是为了适应数字化网络化制播环境,服务于媒体资产管理系统的建设,确保编目数据的有效性和标准化。 1. **编目标准设计目的**:随着广电事业的发展,节目资料的编目和检索变得至关重要。编目标准旨在为...

    数据库技术在高校图书馆管理中的应用

    - 数据库:数据库是存储有组织、可共享数据的集合,旨在提供高效的数据管理和访问。 - 数据库系统:包括数据库、数据库管理系统(DBMS)、开发工具、应用系统、DBA和用户,用于管理和控制数据的定义、操作、安全性...

    图书管理系统 图书管理系统

    例如,`[Content_Types].xml` 文件是用于定义压缩包内不同文件类型的默认处理方式,`word` 目录可能包含系统使用的文档模板或者报告,`docProps` 存储元数据信息,而`_rels` 文件夹则与文件之间的关系描述有关。...

    基于 XML的数字图书馆编目技术 (2006年)

    介绍了国际上流行的对数字图书馆信息资源进行元数据编目的主要手段、XML的主要技术特色和 技术规范、数字图书馆中XML技术支撑下的三种可能的编目模式以及为实现不同编目模式的数字图书馆的数据 交换与资源共享的资源...

    精品专题(2021-2022年收藏)3、《广播电视音像资料编目规范电视资料部分》标准设计及应用说明.doc

    电视资料编目标准设计的主要目的是规范媒体资产管理系统的建设,确保编目数据的有效性和标准化,以服务于节目资料的编目和查询。它不仅为媒资系统的建设和应用提供了基础,而且对于整个节目制作流程,包括采集、编辑...

    分布式异构数据源配置项元模型.pptx

    ### 分布式异构数据源配置项元模型 #### 一、分布式异构数据源配置项概念 在当今数字化转型的时代背景下...它为企业提供了全面的数据管理和配置管理解决方案,帮助企业在面对复杂多变的数据环境时能够更加从容不迫。

    利用Python实现MARC21在RDA编目规则下的自动化批量转换.zip

    RDA规定了如何创建、管理和共享各种类型的信息资源的元数据,包括传统的印刷材料和数字资源。RDA遵循一套详细的指导原则,以确保书目数据的一致性和可互操作性。 Python作为一门强大的编程语言,因其简洁易读的语法...

    档案管理系统方案 (2).docx

    1. **案卷管理子系统**:支持案卷和文件的增删改查,以及附件的上传、绑定和管理,提供XML等格式的数据导出。 2. **编目整理子系统**:预设国家标准和行业标准的档案编目,支持自定义编目导入,提供类目设置、数据...

Global site tag (gtag.js) - Google Analytics