我是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的数据?我确信这是一个非常广泛的主题,所以请随时将我链接到任何相关的网页。谢谢!
答案 0 :(得分:11)
XInclude是唯一具有任何支持级别的标准。
在Wikipedia article on XInclude中有一些很好的使用示例。
XLink是一个与切向相关的标准,不是真正用于包含文档,而是用于引用其他文档中的部分。它没有得到很好的支持。
如果您担心尺寸,可以采用以下几种方法:
doc()
函数和进程读取。 (除非您的处理器是流式处理器或有办法处理完成的文档,如DDXQ或Saxon所做的那样,您仍然会遇到同样大小的问题。)答案 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>