Чи можна імпортувати XML-файл в інший XML-файл?


83

Чи можна імпортувати файл XML в інший файл XML?

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

Відповіді:


93

Ви можете використовувати зовнішню (проаналізовану) загальну сутність .

Ви заявляєте сутність таким чином:

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

Кілька посилань, які можуть бути корисними:


1
Привіт Мадс, я застряг у цьому, що відбувається, коли я переглядаю свій файл main.xml в IE, тоді я отримую текст мого otherFile.xml належним чином, але коли я використовую те саме поняття у своєму додатку та завантажую свій xml у XMLDocument .net, тоді я не отримую текст otherFile.xml, натомість я отримую все, що написано в main.xml, це все <? xml version = "1.0" standalone = "no"?> <! DOCTYPE doc [<! ENTITY otherFile SYSTEM "otherFile.xml">]> <doc> <foo> <bar> & otherFile; </bar> </foo> </doc> чи можете ви сказати мені, якщо мені потрібно зробити щось інше, щоб завантажити його до мого xmldocument ???
Суміт

3
Я не дуже знайомий з API .NET. Однак, можливо, вам доведеться подивитися, для чого встановлено XMLResolverвластивість. Якщо властивість XMLResolver не встановлено для вашого об'єкта XMLDocument, тоді воно може не завантажувати зовнішні ресурси. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Мадс Хансен

1
браузери, такі як chrome, це розуміють?
Альп

3
браузери можуть вимкнути це з міркувань безпеки для локальних файлів. використовувати перемикач --allow-file-access-from-files для chrome або завантажувати на хост
premek.v

1
У .NET встановіть XmlResolver (шляхом створення за замовчуванням XmlUriResolver) і ProhibitDTD (значення false) у XmlReaderSettings, щоб отримати попередні проблеми з дозволами. За замовчуванням, схоже, політика безпеки Windows / .NET не дозволяє завантажувати зовнішні ресурси.
Іван Ісус

26

Інші відповіді охоплюють 2 найпоширеніші підходи, Xinclude та XML зовнішні сутності. Корпорація Майкрософт має справді чудову інформацію про те, чому слід віддавати перевагу 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>

1
Це порівняння між зовнішніми сутностями Xinclude та XML, обидва з яких є першими 2 відповідями і вже показують або надають приклади використання. Я вважав, що це додало до обговорення і було занадто довгим / складним для коментарів. Так само питання задає "можна", а не "як", тому, що стосується відповіді на узагальнене запитання, це йде до з'ясування спрямованості, яка, на мою думку, справді була метою питання. Багато інших хороших посилань на конкретне впровадження. Отже, сказано, дякую за відгук. Незабаром я оновлюю це прикладом.
VoteCoffee

Я вдячний Вашій реакції та повазі за те, що Ви намагалися вирішити проблему, додавши приклад, але я думаю, що Ваша відповідь все ще є суттєво хибною. Як правило, коли ви цитуєте текст з інших місць, ви повинні включити цей текст у блок-цитату (щоб було очевидно, що ви не намагаєтеся плагіатувати) і, що ще важливіше, забезпечити власну дискусію над / під блок-цитатою, яка дуже чітко пояснює, чому ви цитуєте саме цей текст і як він допомагає відповісти на запитання. Якщо я виконаю обидва ці дії і прокоментую ще раз (щоб я отримав сповіщення), я із задоволенням видалю свій коментар і відкликаю свій голос проти.
Ден Бешард

Оновлено блок-цитатами та коментарями
VoteCoffee

Це значно краща відповідь! Проголосував та видалив мій перший коментар, який вже не відповідає дійсності. Я залишу інший коментар для контексту та, сподіваюся, допоможу майбутнім читачам написати кращі відповіді.
Ден Бешард

11

Я спробував із msdn.microsoft.com/en-us/library/aa302291.aspx, але без користі :( Мої Xmls - main.xml <? Xml version = "1.0"?> <Head> <xi: include href = " import.xml " xmlns: xi = " w3.org/2003/XInclude" > </Head> Imported.xml <? xml version = "1.0"?> <footer> © Contoso Corp, 2003 </footer> та остаточний xml, який я отримую, є. <? xml version = "1.0"?> <Head> <xi: include href = " import.xml " xmlns: xi = " w3.org/2003/XInclude " /> </Head> я щось роблю не так?
Суміт

У Java підтримка XInclude повинна бути явно ввімкнена. Можливо, ваша бібліотека вимагає такої ж підготовки?
Томаш Нуркевич

Я використовував .net для синтаксичного аналізу XMl, мені вдалося імпортувати XML за допомогою Mads Solution .. спасибі за ваш час ..
Суміт

1
libxml це підтримує, чудово.
RishiD 05.03.13

1
Для Java потрібно додати рядки нижче - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance (); dbFactory.setXIncludeAware (істина);
Рахул Саху

1

Рішення Мадса Хансена - це добре, але для успіху у читанні зовнішнього файлу в .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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.