【问题标题】:XML - Referencing Other XML FilesXML - 引用其他 XML 文件
【发布时间】:2009-06-30 17:44:03
【问题描述】:

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

【问题讨论】:

  • 这个文件的大小在什么时候很重要?在内存中在存储中?

标签: xml cross-reference


【解决方案1】:

标准

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 所做的那样,您仍然会遇到同样大小的问题。)

【讨论】:

  • XInclude 可能是这个问题的最佳答案。但是,在启用 XInclude 处理的情况下解析文件只会导致内存中的结构与拥有单个大文件相同(好吧,几乎相同)。
  • 后问:XInclude 与引用(ID/IDREF 和 ref/keyref 类型)的工作情况如何?
【解决方案2】:

有几种“标准”方法可以做你想做的事,即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 时,我也没有开始发现大型文档的问题,直到它们在几十兆字节的范围内。

【讨论】:

    【解决方案3】:

    Here 是 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 中加上standalone="no"。 (没有standalone属性假定它等于“no”,但最好把它放在那里......)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 对,但我不想最终得到一个 30 GB 的 XML 文件。出于问题的目的,我简化了我的问题,但如果我要将所有“人员”包含在一个文件中,这就是我所拥有的。
      • 好吧,也许您需要查看其他数据结构?我不会被 30GB 的 xml 文件吓倒。但如果必须,分而治之。我知道有一些方法可以“嵌入/链接”xml 文件,但是对许多小文件的操作将无法将它放在单个文件中。
      【解决方案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>
      

      【讨论】:

      • 我试图强调“Person”存储了很多关于每个人的信息。如果我这样做,我将拥有一百万英里长的人物标签。
      • 为什么你觉得这会是个问题?
      • 嗯,XML 应该是易于阅读的,如果有数百万英里长的属性列表,那听起来就不那么可读了...
      • 是的,你说得对(手工处理)。有时候我就是不这么想……
      • 来自W3C schools:属性的一些问题是:1)属性不能包含多个值(子元素可以)2)属性不容易扩展(以备将来更改)3)属性不能描述结构(子元素可以) 4) 属性更难被程序代码操作 5) 属性值不容易针对 DTD 进行测试
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多