Можем ли мы импортировать XML-файл в другой XML-файл?
Я имею в виду, есть ли в XML какой-либо тег импорта, который принимает путь XML в качестве параметра и импортирует XML (для которого указан путь).
Ответы:
Вы объявляете объект следующим образом:
<!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>
Несколько ссылок, которые могут быть полезны:
XMLResolver
свойство установлено. Если свойство XMLResolver не установлено для вашего объекта XMLDocument, он может не загружать внешние ресурсы. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Другие ответы охватывают 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 в качестве механизма включения были известны в течение некоторого времени и фактически привели к тому, что в 1999 году Microsoft и IBM подали в W3C предложение о включении XML. В предложении определены модель обработки и синтаксис для универсального средства включения 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>
Эта функция называется включением 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>