Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML-引用其他XML文件_Xml_Cross Reference - Fatal编程技术网

XML-引用其他XML文件

XML-引用其他XML文件,xml,cross-reference,Xml,Cross Reference,我是XML新手,所以这可能是一个相当容易回答的问题。我想知道是否有从其他XML文件中引用外部XML文件的标准方法。让我举个例子。假设您有一个文件,该文件定义了一个包含大量数据的对象: <person> <name>John</name> <age>18</age> <hair>Brown</hair> <eyes>Blue</eyes> </perso

我是XML新手,所以这可能是一个相当容易回答的问题。我想知道是否有从其他XML文件中引用外部XML文件的标准方法。让我举个例子。假设您有一个文件,该文件定义了一个包含大量数据的对象:

<person>
    <name>John</name>
    <age>18</age>
    <hair>Brown</hair>
    <eyes>Blue</eyes>
</person>

约翰
18
棕色的
蓝色
为了回答这个问题,假设此人持有大量其他信息。假设文件大小为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>

约翰
18
棕色的
蓝色
基姆
21
蓝色
绿色
肖恩
22
黑色
棕色的

如您所见,如果Person的文件非常大,那么组文件将非常大。那么,如果我们有类似于John.xml的东西,有没有一种标准方法可以在Group.xml中引用它,而不显式地定义John的所有数据?我相信这是一个非常广泛的话题,所以请随时将我链接到任何相关的网页。谢谢

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

有两种“标准”方法可以做你想做的事情,即(取决于你想做什么),不过你必须确保你有一个可以拉入外部引用的处理器。大多数XML库都没有启用此功能

然后你就可以做点什么了:


然而,你可能并不真的需要这个。如果您需要一个大型文档中的信息子集,那么可以轻松地使用XSLT或XQuery删除您需要的部分。您可以使用这种方法,再加上SAX解析(基于事件,并且没有整个文档在内存中),来扩展应用程序以处理相当大的文档

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

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

一个简单的文档,如:

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

<test>
    &ref;
</test>

&ref;
及file:///C:/test.txt 是:

<blah>
Fee
Fi
Fo
Fum
</blah>

费用
Fi
法罗群岛
烟
将原始文档扩展为:

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

费用
Fi
法罗群岛
烟
我相信扩展引用不需要非验证性XML解析器,所以在这方面要小心

另外,不要忘记在XMLDecl中输入standalone=“no”。(没有独立属性假定它等于“否”,但最好将它放在那里……

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

  • 几个XML编辑器,包括并支持它
  • 包括在内的几个XML解析器也支持它,并且还有.net端口
  • 一些XML工具,例如支持Java和XML
在这个例子中有一些很好的例子

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

选择 如果您担心尺寸,有几种方法:

  • 使用流式XML处理器,例如(或在较小程度上),它只在内存中保留解决查询所需的信息
  • 使用XML数据库,如或
  • 使用一个XML文件列出其他XML文件的名称,然后一些用XQuery或XSLT编写的程序使用
    doc()
    函数和进程读取这些文件。(除非您的处理器正在进行流式处理,或者有办法处理完文件,否则您仍然会遇到相同大小的问题。)

是的,但我不想以一个30 GB的XML文件结束。为了这个问题,我简化了我的问题,但如果我要包括所有的“人”在单个文件中,这就是我想要的。也许你需要查看其他数据结构?我不会被一个30GB的xml文件吓倒。但如果你必须,分而治之。我知道有很多方法可以“嵌入/链接”xml文件,但在许多小文件上的操作将无法在单个文件中实现。我试图强调“人”存储关于每个人的大量信息。如果我这样做,我会有一百万英里长的个人标记。为什么你觉得这会是一个问题?XML应该很容易阅读,如果有几百万英里长的属性列表,听起来就不那么可读了……是的,你有一点(手工处理)。有时我不这么想……From:属性的一些问题是:1)属性不能包含多个值(子元素可以)2)属性不容易扩展(对于将来的更改)3)属性不能描述结构(子元素可以)4)属性更难通过程序代码进行操作5)属性值不容易根据DTDX进行测试Include可能是这个问题的最佳答案。但是,在启用XInclude处理的情况下解析文件只会在内存中产生与单个大文件相同的(好的,几乎相同)结构。发问:XInclude在引用(ID/IDREF和ref/keyref类型)方面的工作情况如何?此文件的大小在哪一点上重要?在内存中,在存储中?
<test>
    <blah>
    Fee
    Fi
    Fo
    Fum
    </blah>
</test>