Можем ли мы импортировать файл 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>
Эта функция называется XML-включениями (XInclude). Некоторые примеры:
Решение Мэдса Хансена хорошо, но чтобы преуспеть в чтении внешнего файла в.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>