Подтвердить что ты не робот

XML - ссылки на другие файлы XML

Я новичок в XML, так что это может быть довольно простой вопрос для ответа. Мне было интересно, существует ли стандартный способ ссылки на внешние XML файлы из других XML файлов. Позвольте мне привести пример. Скажем, у вас есть файл, который определяет один объект, который содержит большой объем данных:

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

Ради этого вопроса притворяйтесь, что человек содержит множество другой информации. Представьте, что файл похож на 10 МБ.

Теперь скажем, у вас есть еще один 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 был очень большим, файл группы был бы чрезвычайно большим. Итак, если у нас есть что-то вроде John.xml, есть ли стандартный способ ссылаться на него в Group.xml без явного определения всех данных Джона? Я уверен, что это очень широкая тема, поэтому не стесняйтесь связывать меня с любыми релевантными веб-страницами. Спасибо!

4b9b3361

Ответ 1

Стандарты

XInclude является единственным стандартом с любым уровнем поддержки.

  • Несколько XML-редакторов, включая Oxygen и xmlspy поддерживайте его.
  • Несколько XML-парсеров, включая Xerces, также поддерживают его, а также есть .net-порты.
  • Несколько инструментов XML, таких как Saxon поддерживают его, как для Java, так и . чистый.

Есть несколько хороших примеров использования в статье Википедии о XInclude.

XLink - это тангенциально связанный стандарт, а не только для включения документов, но больше для цитирования частей в других документах. Это не очень хорошо поддерживается.

Альтернативы

Если вы беспокоитесь о размере, есть несколько способов:

  • Используйте потоковый XML-процессор, например DataDirect XQuery (или, в меньшей степени, Saxon 9.3 EE, который хранит столько информации в памяти, сколько необходимо для решения запроса.
  • Используйте XML-базу данных, такую ​​как MarkLogic или eXist.
  • Используйте один XML файл, чтобы перечислить имена других XML файлов, которые некоторые программы, написанные в XQuery или XSLT, затем читаются с использованием функции doc() и процессов. (Если ваш процессор не работает или имеет способ избавиться от документов, он завершен с помощью DDXQ или Saxon, вы все равно столкнетесь с такой же проблемой размера.)

Ответ 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 я не стал рассматривать проблемы с большими документами, пока они не были в диапазоне десятков мегабайт.

Ответ 3

Здесь - это спецификация XML для DTD, в которой вы можете объявлять ссылки на сущности.

Простой документ вроде:

<!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 не требуют расширения ссылок, поэтому будьте осторожны.

Кроме того, не забудьте поставить standalone = "no" в XMLDecl. (Не имея автономного атрибута, предполагается, что он равен "нет", но его еще лучше поставить там...)

Ответ 4

Um, нет ограничений по размеру для xml файлов. вы не должны беспокоиться о чрезвычайно больших размерах. Но помни; 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>