¿Podemos importar un archivo XML a otro archivo XML?


¿Podemos importar un archivo XML a otro archivo XML?

Quiero decir si hay alguna etiqueta de importación en XML que tome XML path como parámetro e importe XML (para el que se proporciona path).

Author: Mads Hansen, 2011-02-25

4 answers

Usted podría utilizar un entidad general externa (analizada) .

Declaras la entidad así: {[12]]}

<!ENTITY otherFile SYSTEM "otherFile.xml">

Entonces usted lo hace referencia así: {[12]]}

&otherFile;

Un ejemplo completo:

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
  <foo>
    <bar>&otherFile;</bar>
  </foo>
</doc>

Cuando el analizador XML lee el archivo, expandirá la referencia de entidad e incluirá el archivo XML referenciado como parte del contenido.

Si el "otherFile.xml" contenido: <baz>this is my content</baz>

Entonces el XML sería evaluado y "visto" por un analizador XML as:

<?xml version="1.0" standalone="no" ?>
<doc>
  <foo>
    <bar><baz>this is my content</baz></bar>
  </foo>
</doc>

Algunas referencias que podrían ser útiles:

 81
Author: Mads Hansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-26 15:58:36

Las otras respuestas cubren los 2 enfoques más comunes, Xinclude y XML external entities. Microsoft tiene una muy buena valoración crítica de por qué uno debe preferir Xinclude, así como varias implementaciones de ejemplo. He citado la comparación a continuación:

Per http://msdn.microsoft.com/en-us/library/aa302291.aspx

¿Por qué XInclude?

La primera pregunta que se puede hacer es " Por qué usar XInclude en lugar de XML las entidades externas?"La respuesta es que XML externo las entidades tienen un número de limitaciones bien conocidas e implicaciones inconvenientes, que evitar efectivamente que sean una inclusión de propósito general instalación. Específicamente:

  • Una entidad externa XML no puede ser un documento XML independiente en toda regla-ni la declaración XML independiente ni la declaración Doctype permitir. Eso significa efectivamente que una entidad externa XML no puede incluir otras entidades externas.
  • Una entidad externa XML debe estar bien formada XML (no está tan mal a primera vista, pero imagine que desea incluir código C # de muestra en su XML documento).
  • No cargar una entidad externa es un error fatal; cualquier recuperación está estrictamente prohibida.
  • Solo se puede incluir toda la entidad externa, no hay forma de incluir solo una parte de un documento. - Las entidades externas deben declararse en un DTD o en un subconjunto interno. Esto abre una Caja de Pandora llena de implicaciones, como el hecho de que el elemento document debe ser nombrado en la declaración Doctype y que la validación de los lectores puede requerir que el modelo de contenido completo de la documento definido en DTD entre otros.

Las deficiencias del uso de entidades externas XML como inclusión mecanismo han sido conocidos desde hace algún tiempo y de hecho dio lugar a la presentación de la Propuesta de Inclusión XML al W3C en 1999 por Microsoft e IBM. La propuesta definió un modelo de procesamiento y una sintaxis para una instalación de inclusión XML de propósito general.

Cuatro años después, la versión 1.0 de las Inclusiones XML, también conocida como Xinclude, es una Recomendación Candidata, lo que significa que el W3C considera que ha sido ampliamente revisado y satisface la problemas técnicos que se propuso resolver, pero aún no es un recomendación.

Otro buen sitio que proporciona una variedad de implementaciones de ejemplo es https://www.xml.com/pub/a/2002/07/31/xinclude.html . A continuación se muestra un ejemplo de caso de uso común de su sitio:

<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>
 16
Author: VoteCoffee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-09 17:43:27
 12
Author: Tomasz Nurkiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-25 18:24:10

La solución de Mads Hansen es buena, pero para tener éxito en la lectura del archivo externo en.NET 4 tomó algún tiempo para averiguar el uso de sugerencias en los comentarios sobre los resolutores, ProhibitDTD y así sucesivamente.

Así es como se hace:

        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;
        }

Archivo de registro.xml:

<?xml version="1.0"?>
<!DOCTYPE logfile [
<!ENTITY events    
 SYSTEM "events.txt">
]>
<logfile>
&events;
</logfile>

Eventos.txt:

<event>
    <item1>item1</item1>
    <item2>item2</item2>
</event>
 0
Author: user3717478,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 11:50:22