XML: как загрузить содержимое одного XML-файла в другой - PullRequest
2 голосов
/ 28 апреля 2011

Мне бы хотелось иметь возможность динамически записывать содержимое XML-файла из другого XML-файла.

A.XML содержит:

<?xml version="1.0"?>
<node>
-Include Contents of b.xml
</node>

B.XML содержит:

<anode>
a
</anode>

Есть ли способ сделать это в XML?

Конечный продукт выглядит так:

<?xml version="1.0"?>
<node>
  <anode>
    a
  </anode>
</node>

Обновление от комментариев :

Только в xml. так что когда я смотрю XML-файл в браузере он отображает правильно

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

Использовать внешнюю (проанализированную) общую сущность для ссылки на b.xml из a.xml.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE node [
<!ENTITY b SYSTEM "b.xml">
]>
<node>
    &b;
</node>

Синтаксический анализатор XML будет динамически включать содержимое b.xml, так как онанализирует a.xml и выдаст желаемый XML.

Если вы загрузите a.xml в IE, он будет отображаться правильно.

Примечание: Некоторые браузеры имеют очень строгие политики безопасности, которые вызывают проблемы при загрузке ссылочных файлов XML из файловой системы и расширении ссылок на сущности, поэтому он может работать не во всех браузерах, если вы загрузите a.xmlиз файловой системы, но может работать в большем количестве браузеров, если вы загружаете с URL.

1 голос
/ 29 апреля 2011

Когда этот XML-документ открывается в браузере:

<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
<node>
 -Include Contents of b.xml
</node>

С этой таблицей стилей XSLT (другой XML-документ ) ссылается с stylesheet.xsl относительным URI:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="node">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:copy-of select="document('B.xml')"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Он отображается (без какого-либо стиля или с таблицей стилей XML браузера по умолчанию) как:

<node>
    <anode>a</anode>
</node>

Примечание : инструкция обработки.Я использовал инструкцию xsl:copy-of, потому что не хотел путать вас с возможной бесконечной рекурсией ...

...