¿Podemos importar un archivo XML a otro archivo XML?
Quiero decir, ¿hay alguna etiqueta de importación en XML que tome la ruta XML como parámetro e importe XML (para la que se proporciona la ruta)?
Respuestas:
Declaras la entidad así:
<!ENTITY otherFile SYSTEM "otherFile.xml">
Luego lo referencia de esta manera:
&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 la entidad e incluirá el archivo XML referenciado como parte del contenido.
Si el "otherFile.xml" contenía: <baz>this is my content</baz>
Entonces el XML sería evaluado y "visto" por un analizador XML como:
<?xml version="1.0" standalone="no" ?>
<doc>
<foo>
<bar><baz>this is my content</baz></bar>
</foo>
</doc>
Algunas referencias que pueden resultar útiles:
XMLResolver
está configurada la propiedad. Si la propiedad XMLResolver no está establecida en su objeto XMLDocument, es posible que no cargue recursos externos. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Las otras respuestas cubren los 2 enfoques más comunes, Xinclude y entidades externas XML. Microsoft tiene un artículo realmente bueno sobre por qué uno debería preferir Xinclude, así como varias implementaciones de ejemplo. He citado la siguiente comparación:
Según http://msdn.microsoft.com/en-us/library/aa302291.aspx
¿Por qué XInclude?
La primera pregunta que uno puede hacer es "¿Por qué utilizar XInclude en lugar de entidades externas XML?" La respuesta es que las entidades externas XML tienen una serie de limitaciones conocidas e implicaciones inconvenientes que impiden que sean una instalación de inclusión de propósito general. Específicamente:
- Una entidad externa XML no puede ser un documento XML independiente en toda regla; no se permiten declaraciones XML independientes ni declaraciones Doctype. Eso significa efectivamente que una entidad externa XML en sí misma no puede incluir otras entidades externas.
- Una entidad externa XML debe estar bien formada (no tan mal a primera vista, pero imagina que quieres incluir código C # de muestra en tu documento XML).
- 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 un subconjunto interno. Esto abre una caja de Pandora llena de implicaciones, como el hecho de que el elemento del documento debe ser nombrado en la declaración Doctype y que los lectores de validación pueden requerir que el modelo de contenido completo del documento esté definido en DTD, entre otros.
Las deficiencias del uso de entidades externas XML como mecanismo de inclusión se conocen desde hace algún tiempo y, de hecho, dieron 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 XML Inclusions, también conocida como Xinclude, es una recomendación candidata, lo que significa que el W3C cree que ha sido ampliamente revisada y satisface los problemas técnicos básicos que se propuso resolver, pero aún no es una recomendación. recomendación completa.
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>
Esta característica se llama Inclusiones XML (XInclude) . Algunos ejemplos:
La solución de Mads Hansen es buena, pero para tener éxito en la lectura del archivo externo en .NET 4 tomó algo de tiempo averiguar el uso de sugerencias en los comentarios sobre resolutores, ProhibitDTD, etc.
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;
}
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>