Peut-on importer un fichier XML dans un autre fichier XML?
Je veux dire, existe-t-il une balise d’importation dans XML qui prend le chemin XML en tant que paramètre et importe XML (pour lequel le chemin est fourni).
Vous déclarez l'entité comme ceci:
<!ENTITY otherFile SYSTEM "otherFile.xml">
Ensuite, vous le référencez comme ceci:
&otherFile;
Un exemple complet:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
<foo>
<bar>&otherFile;</bar>
</foo>
</doc>
Lorsque l'analyseur XML lit le fichier, il développe la référence de l'entité et inclut le fichier XML référencé dans le contenu.
Si le fichier "otherFile.xml" contenait: <baz>this is my content</baz>
Ensuite, le XML serait évalué et "vu" par un analyseur XML sous la forme:
<?xml version="1.0" standalone="no" ?>
<doc>
<foo>
<bar><baz>this is my content</baz></bar>
</foo>
</doc>
Quelques références qui pourraient être utiles:
Les autres réponses couvrent les 2 approches les plus courantes, Xinclude et les entités externes XML. Microsoft explique très bien pourquoi on devrait préférer Xinclude, ainsi que plusieurs exemples de mise en œuvre. J'ai cité la comparaison ci-dessous:
Per http://msdn.Microsoft.com/en-us/library/aa302291.aspx
Pourquoi XInclude?
La première question que l'on peut se poser est la suivante: "Pourquoi utiliser XInclude au lieu de XML Entités externes?" La réponse est que les entités externes XML ont un nombre de limitations connues et d’incidences peu pratiques, qui les empêchent efficacement d’être une inclusion à vocation générale établissement. Plus précisément:
- Une entité externe XML ne peut pas être un document XML indépendant complet. Aucune déclaration XML autonome ni déclaration Doctype n'est permis. Cela signifie effectivement qu'une entité externe XML elle-même ne peut pas inclure d'autres entités externes.
- Une entité externe XML doit être un XML bien formé (pas si mal au premier abord, mais imaginons que vous souhaitiez inclure un exemple de code C # dans votre document XML ).
- Le fait de ne pas charger une entité externe est une erreur fatale. toute récupération est strictement interdite.
- Seule l'entité externe entière peut être incluse, il n'y a aucun moyen de n'inclure qu'une partie d'un document . -Les entités externes doivent être déclarées dans une DTD ou un sous-ensemble interne. Cela ouvre une boîte de Pandore pleine d'implications, telles que le fait que l'élément de document doit être nommé dans la déclaration Doctype et que la validation des lecteurs peut nécessiter que le modèle de contenu complet du fichier document être défini dans DTD entre autres.
Les inconvénients d'utiliser des entités externes XML en tant qu'inclusion mécanisme sont connus depuis un certain temps et ont en fait engendré le soumission de la proposition d'inclusion XML au W3C en 1999 par Microsoft et IBM. La proposition définissait un modèle de traitement et une syntaxe pour une installation d'inclusion XML à usage général.
Quatre ans plus tard, la version 1.0 de XML Inclusions, également connue sous le nom de Xinclude est une recommandation candidate, ce qui signifie que le W3C estime qu’il a fait l’objet de nombreux examens et satisfait aux critères de base problèmes techniques qu’il s’est efforcé de résoudre, mais n’est pas encore complet recommandation.
Un autre bon site proposant une variété d’exemples d’implémentation est https://www.xml.com/pub/a/2002/07/31/xinclude.html . Vous trouverez ci-dessous un exemple de cas d'utilisation courant sur leur 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>
Cette fonctionnalité est appelée Inclusions XML (XInclude) . Quelques exemples:
La solution de Mads Hansen est bonne, mais pour réussir à lire le fichier externe dans .NET 4, il a fallu un certain temps pour trouver des astuces dans les commentaires sur les résolveurs, ProhibitDTD, etc.
Voici comment cela se fait:
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>