Можем ли мы импортировать файл XML в другой файл XML? - PullRequest
76 голосов
/ 25 февраля 2011

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

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

Ответы [ 4 ]

87 голосов
/ 26 февраля 2011

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

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

<!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>

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

20 голосов
/ 27 ноября 2013

Другие ответы охватывают 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 или внутреннем подмножестве.Это открывает ящик Пандоры, полный значений, таких как тот факт, что элемент документа должен быть назван в объявлении Doctype, и что для проверки читателей может потребоваться, чтобы среди прочего была определена полная модель содержимого документа в DTD.

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

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

Еще один хороший сайт, который предоставляет множество примеров реализации, - https://www.xml.com/pub/a/2002/07/31/xinclude.html. Ниже приведен пример общего использования с их сайта:

<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>
12 голосов
/ 25 февраля 2011
0 голосов
/ 09 апреля 2018

Решение Мэдса Хансена хорошо, но чтобы преуспеть в чтении внешнего файла в .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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...