我是新来的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但没有明确定义所有约翰的数据的标准方法是什么? 我敢肯定,这是一个非常广泛的话题,所以随时给我链接到任何相关的网页。 谢谢!
标准
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或撒克逊通过这样做,你还是会遇到同样大小的问题。)
有一对夫妇的“标准”的方式做你想做的,即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,我并没有开始看到大文件的问题,直到他们在几十兆的范围内。
这里是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。 (不具有独立的属性假定它等于“否”,但它仍然不如把它放在那里...)
嗯,也有对XML文件没有大小限制。 你不应该担心非常大的尺寸。 但要记住; XML是一种数据交换格式,而不是数据库格式。 您可以使用XML交换不同的应用程序/服务之间的数据。
有没有标准(将在每一个解析器工作)导入这样的节点。 但是你可以通过改变你的一些元素的属性,以节省空间
<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>