Можем ли мы импортировать файл XML в другой файл XML?

Можем ли мы импортировать файл XML в другой файл XML?

Я имею в виду, есть ли какой-либо тег импорта в XML, который принимает путь XML в качестве параметра и импортирует XML (для которого указан путь).

4 ответа

Решение

Вы можете использовать внешнюю (разобранную) общую сущность.

Вы объявляете сущность следующим образом:

<!ENTITY otherFile SYSTEM "otherFile.xml">

Тогда вы ссылаетесь на это так:

&otherFile;

Полный пример:

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
  <foo>
    <bar>&otherFile;</bar>
  </foo>
</doc>

Когда синтаксический анализатор XML читает файл, он расширяет ссылку на сущность и включает указанный XML-файл как часть содержимого.

Если "otherFile.xml" содержал: <baz>this is my content</baz>

Затем XML будет оцениваться и "просматриваться" синтаксическим анализатором XML как:

<?xml version="1.0" standalone="no" ?>
<doc>
  <foo>
    <bar><baz>this is my content</baz></bar>
  </foo>
</doc>

Несколько ссылок, которые могут быть полезны:

Другие ответы охватывают 2 наиболее распространенных подхода: внешние сущности Xinclude и XML. У Microsoft действительно хорошая статья о том, почему стоит отдать предпочтение Xinclude, а также несколько примеров реализации. Я привел сравнение ниже:

За http://msdn.microsoft.com/en-us/library/aa302291.aspx

Почему XInclude?

Первый вопрос, который можно задать: "Зачем использовать XInclude вместо внешних сущностей XML?" Ответ заключается в том, что внешние сущности XML имеют ряд хорошо известных ограничений и неудобных последствий, которые эффективно не позволяют им быть средством включения общего назначения. В частности:

  • Внешняя сущность XML не может быть полноценным независимым документом XML - ни отдельное объявление XML, ни объявление Doctype недопустимы. Это фактически означает, что сама внешняя сущность XML не может включать в себя другие внешние сущности.
  • Внешняя сущность XML должна быть правильно сформированным XML (на первый взгляд, неплохо, но представьте, что вы хотите включить пример кода C# в ваш XML-документ).
  • Ошибка загрузки внешнего объекта является фатальной ошибкой; любое восстановление строго запрещено.
  • Может быть включена только вся внешняя сущность, нет способа включить только часть документа. -Внешние объекты должны быть объявлены в DTD или внутреннем подмножестве. Это открывает ящик Pandora, полный значений, таких как тот факт, что элемент документа должен быть назван в объявлении Doctype, и что проверяющие читатели могут потребовать, чтобы модель полного содержимого документа была определена в DTD среди других.

Недостатки использования внешних сущностей XML в качестве механизма включения были известны в течение некоторого времени и фактически породили представление предложения о включении XML в W3C в 1999 году Microsoft и IBM. Предложение определило модель обработки и синтаксис для универсального средства включения XML.

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

Еще один хороший сайт, который предоставляет множество примеров реализации, - это /questions/36874024/lyuboe-reshenie-dlya-isklyucheniya-nezakonnoj-operatsii-perekrestnoj-rezbyi/36874046#36874046. Ниже приведен пример общего использования с их сайта:

<book xmlns:xi="http://www.w3.org/2001/XInclude">

  <title>The Wit and Wisdom of George W. Bush</title>

  <xi:include href="malapropisms.xml"/>

  <xi:include href="mispronunciations.xml"/>

  <xi:include href="madeupwords.xml"/>

</book>

Решение Мэдса Хансена хорошо, но чтобы преуспеть в чтении внешнего файла в.NET 4, понадобилось некоторое время, чтобы разобраться, используя подсказки в комментариях о средствах разрешения, ProhibitDTD и так далее.

Вот как это делается:

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.DtdProcessing = DtdProcessing.Parse;
        XmlUrlResolver resolver = new XmlUrlResolver();
        resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
        settings.XmlResolver = resolver;
        var reader = XmlReader.Create("logfile.xml", settings);
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        foreach (XmlElement element in doc.SelectNodes("//event"))
        {
            var ch = element.ChildNodes;
            var count = ch.Count;
        }

logfile.xml:

<?xml version="1.0"?>
<!DOCTYPE logfile [
<!ENTITY events    
 SYSTEM "events.txt">
]>
<logfile>
&events;
</logfile>

events.txt:

<event>
    <item1>item1</item1>
    <item2>item2</item2>
</event>
Другие вопросы по тегам