XML - 引用其他XML文件(XML - Referencing Other XML Files

2019-06-24 13:31发布

我是新来的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>

正如你所看到的,如果的非常大,该集团文件将是非常大的。 所以,如果我们有像John.xml,有没有引用它在Group.xml但没有明确定义所有约翰的数据的标准方法是什么? 我敢肯定,这是一个非常广泛的话题,所以随时给我链接到任何相关的网页。 谢谢!

Answer 1:

标准

XInclude的是支持任何水平的唯一标准。

  • 一些XML编辑器,包括氧气和XMLSpy的支持。
  • 几个XML解析器,包括Xerces的 ,也支持它,而且有.NET端口了。
  • 几个XML工具,比如撒克逊人支持它,无论是Java和.NET 。

还有的在使用中的一些很好的例子在XInclude的维基百科文章 。

XLink的是切向相关的标准,不是真的,包括文档,但更多的引用其他文档中的部分。 这不是很好的支持。

备择方案

如果你担心大小,有几种方法去:

  • 使用流XML处理器 ,诸如DataDirect的XQuery的 (或在较小程度上, 撒克逊9.3 EE ,它仅在必要时保持尽可能多的信息在存储器中,以解决该查询。
  • 使用XML数据库 ,比如MarkLogic或eXist中 。
  • 使用一个XML文件中列出的其他XML文件的名字,写在的XQuery或XSLT那么一些程序读取使用其doc()函数和过程。 (除非您的处理器是流还是有办法处置它已完成,如文档DDXQ或撒克逊通过这样做,你还是会遇到同样大小的问题。)


Answer 2:

有一对夫妇的“标准”的方式做你想做的,即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,我并没有开始看到大文件的问题,直到他们在几十兆的范围内。



Answer 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解析器不需要扩大了引用,所以要谨慎那里。

另外,不要忘了把独立=“无”的XMLDecl。 (不具有独立的属性假定它等于“否”,但它仍然不如把它放在那里...)



Answer 4:

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



Answer 5:

有没有标准(将在每一个解析器工作)导入这样的节点。 但是你可以通过改变你的一些元素的属性,以节省空间

<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>


文章来源: XML - Referencing Other XML Files