Podemos importar um arquivo XML para outro arquivo XML?
Quero dizer, existe alguma tag de importação em XML que leva o caminho XML como parâmetro e importa XML (para o qual o caminho é fornecido).
Respostas:
Você declara a entidade assim:
<!ENTITY otherFile SYSTEM "otherFile.xml">
Então você o referencia assim:
&otherFile;
Um exemplo completo:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
<foo>
<bar>&otherFile;</bar>
</foo>
</doc>
Quando o analisador XML lê o arquivo, ele expande a referência da entidade e inclui o arquivo XML referenciado como parte do conteúdo.
Se o "otherFile.xml" continha: <baz>this is my content</baz>
Então o XML seria avaliado e "visto" por um analisador XML como:
<?xml version="1.0" standalone="no" ?>
<doc>
<foo>
<bar><baz>this is my content</baz></bar>
</foo>
</doc>
Algumas referências que podem ser úteis:
XMLResolver
propriedade está definida. Se a propriedade XMLResolver não estiver configurada em seu objeto XMLDocument, ele pode não carregar recursos externos. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
As outras respostas cobrem as 2 abordagens mais comuns, entidades externas Xinclude e XML. A Microsoft tem um ótimo artigo sobre porque alguém deve preferir o Xinclude, bem como vários exemplos de implementações. Citei a comparação abaixo:
Por http://msdn.microsoft.com/en-us/library/aa302291.aspx
Por que XInclude?
A primeira pergunta que se pode fazer é "Por que usar XInclude em vez de entidades externas XML?" A resposta é que as entidades externas de XML têm uma série de limitações conhecidas e implicações inconvenientes, que efetivamente as impedem de serem um recurso de inclusão de propósito geral. Especificamente:
- Uma entidade externa XML não pode ser um documento XML independente completo - nem a declaração XML autônoma nem a declaração Doctype são permitidas. Isso significa que uma entidade externa XML em si não pode incluir outras entidades externas.
- Uma entidade externa XML deve ser um XML bem formado (não tão ruim à primeira vista, mas imagine que você deseja incluir código C # de amostra em seu documento XML).
- Deixar de carregar uma entidade externa é um erro fatal; qualquer recuperação é estritamente proibida.
- Apenas a entidade externa inteira pode ser incluída, não há como incluir apenas uma parte de um documento. - As entidades externas devem ser declaradas em um DTD ou em um subconjunto interno. Isso abre uma caixa de Pandora cheia de implicações, como o fato de que o elemento do documento deve ser nomeado na declaração Doctype e que os leitores de validação podem exigir que o modelo de conteúdo completo do documento seja definido no DTD, entre outros.
As deficiências de usar entidades externas XML como mecanismo de inclusão são conhecidas há algum tempo e de fato geraram o envio da Proposta de Inclusão de XML ao W3C em 1999 pela Microsoft e IBM. A proposta definiu um modelo de processamento e sintaxe para um recurso de inclusão XML de propósito geral.
Quatro anos depois, a versão 1.0 do XML Inclusions, também conhecido como Xinclude, é uma recomendação candidata, o que significa que o W3C acredita que foi amplamente revisado e satisfaz os problemas técnicos básicos que se propôs a resolver, mas ainda não é um recomendação completa.
Outro bom site que fornece uma variedade de exemplos de implementação é https://www.xml.com/pub/a/2002/07/31/xinclude.html . Abaixo está um exemplo de caso de uso comum de seu site:
<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>
Este recurso é denominado Inclusões XML (XInclude) . Alguns exemplos:
A solução de Mads Hansen é boa, mas para ter sucesso na leitura do arquivo externo no .NET 4 levou algum tempo para descobrir usando dicas nos comentários sobre resolvers, ProhibitDTD e assim por diante.
Assim que se faz:
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>