XML - 引用其他XML文件

时间:2009-06-30 17:44:04

标签: xml cross-reference

我是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的数据?我确信这是一个非常广泛的主题,所以请随时将我链接到任何相关的网页。谢谢!

5 个答案:

答案 0 :(得分:11)

标准

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

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

Wikipedia article on XInclude中有一些很好的使用示例。

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

替代

如果您担心尺寸,可以采用以下几种方法:

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

答案 1 :(得分:4)

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

然后你就可以做一些like

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

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

即使在使用DOM时,我也没有看到大文档出现问题,直到它们达到数十兆字节范围。

答案 2 :(得分:1)

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

一个简单的文件,如:

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

<test>
    &ref;
</test>

并且文件:/// C:/test.txt是:

<blah>
Fee
Fi
Fo
Fum
</blah>

将原始文档扩展为:

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

我确实认为不需要非验证的XML解析器来扩展引用,所以在那里要小心。

另外,不要忘记在XMLDecl中放置standalone =“no”。 (没有独立属性假设它等于“否”,但它仍然更好地把它放在那里......)

答案 3 :(得分:0)

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

答案 4 :(得分: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>