18

我是 XML 新手,所以这可能是一个相当容易回答的问题。我想知道是否有从其他 XML 文件中引用外部 XML 文件的标准方法。让我举个例子。假设您有一个文件,该文件定义了一个包含大量数据的对象:

<person>
    <name>John</name>
    <age>18</age>
    <hair>Brown</hair>
    <eyes>Blue</eyes>
</person>

为了这个问题,假设那个人拥有大量其他信息。假装文件是 10 MB。

现在,假设您有另一个定义组的 XML 文件:

<group>
    <person>
        <name>John</name>
        <age>18</age>
        <hair>Brown</hair>
        <eyes>Blue</eyes>
    </person>
    <person>
        <name>Kim</name>
        <age>21</age>
        <hair>Blue</hair>
        <eyes>Green</eyes>
    </person>
    <person>
        <name>Sean</name>
        <age>22</age>
        <hair>Black</hair>
        <eyes>Brown</eyes>
    </person>
</group>

如您所见,如果Person非常大,则Group文件将非常大。那么,如果我们有类似John.xml的内容,是否有一种标准方法可以在Group.xml中引用它,而无需明确定义 John 的所有数据?我确信这是一个非常广泛的主题,因此请随时将我链接到任何相关网页。谢谢!

4

5 回答 5

12

标准

XInclude是唯一具有任何级别支持的标准。

  • 几个 XML 编辑器,包括Oxygenxmlspy 都支持它。
  • 包括Xerces在内的几个 XML 解析器也支持它,并且还有 .net 端口。
  • 一些 XML 工具(例如Saxon)支持 Java 和.net

在 XInclude 的 Wikipedia 文章中有一些很好的使用示例。

XLink是一个切向相关的标准,并不是真正用于包含文档,而是更多地用于引用其他文档中的部分。它没有得到很好的支持。

备择方案

如果您担心尺寸,有几种方法:

  • 使用流式 XML 处理器,例如DataDirect XQuery(或在较小程度上,Saxon 9.3 EE,它只在内存中保留解决查询所需的尽可能多的信息。
  • 使用XML 数据库,例如MarkLogiceXist
  • 使用一个 XML 文件列出其他 XML 文件的名称,某些用 XQuery 或 XSLT 编写的程序然后使用doc()函数和进程读取这些文件。(除非您的处理器正在流式传输或有办法处理已完成的文档,如DDXQSaxon所做的那样,您仍然会遇到同样大小的问题。)
于 2009-07-01T05:55:24.687 回答
5

有几种“标准”方法可以做你想做的事,即XLink 和 XInclude(取决于你想要做什么),但你必须确保你有一个可以拉入外部引用的处理器。大多数 XML 库都没有启用此功能。

然后你就可以做类似的事情

<group>
  <personlink xlink:href="person.xml" xlink:show="embed" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</group>

但是,您可能并不真正需要这个。如果您需要来自大型文档的信息子集,您可以轻松地使用 XSLT 或 XQuery 修剪出您需要的部分。您可以使用这种方法以及 SAX 解析(它基于事件并且没有将整个文档保存在内存中)来扩展您的应用程序以处理相当大的文档。

即使在使用 DOM 时,我也没有开始看到大型文档的问题,直到它们在几十兆字节的范围内。

于 2009-06-30T18:29:48.430 回答
3

是 DTD 的 XML 规范,您可以在其中声明实体引用。

一个简单的文档,例如:

<!DOCTYPE test [
    <!ENTITY ref SYSTEM "file:///C:/test.txt" >
]>

<test>
    &ref;
</test>

并且 file:///C:/test.txt 是:

<blah>
Fee
Fi
Fo
Fum
</blah>

将原始文档扩展为:

<test>
    <blah>
    Fee
    Fi
    Fo
    Fum
    </blah>
</test>

我确实相信扩展引用不需要非验证 XML 解析器,所以要小心。

另外,不要忘记将standalone="no" 放在XMLDecl 中。(没有独立属性假定它等于“否”,但最好把它放在那里......)

于 2009-06-30T18:38:23.783 回答
0

嗯,xml 文件没有大小限制。你不应该担心非常大的尺寸。但要记住; XML 是一种数据交换格式,而不是数据库格式。您使用 xml 在不同的应用程序/服务之间交换数据。

于 2009-06-30T17:51:25.793 回答
0

没有标准(适用于每个解析器)来导入这样的节点。但是您可以通过将一些元素更改为属性来节省空间

<group>
  <person name='John' age='18' hair='Brown' eyes='Blue' />
  <person name='Kim' age='21' hair='Blue' eyes='Green' />
  <person name='Sean' age='22' hair='Black' eyes='Brown' />
</group>
于 2009-06-30T17:53:52.640 回答