Können wir eine XML-Datei in eine andere XML-Datei importieren?
Ich meine, gibt es ein Import-Tag in XML, das den XML-Pfad als Parameter verwendet und XML importiert (für das der Pfad angegeben ist).
Antworten:
Sie deklarieren die Entität wie folgt:
<!ENTITY otherFile SYSTEM "otherFile.xml">
Dann verweisen Sie darauf wie folgt:
&otherFile;
Ein vollständiges Beispiel:
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
<foo>
<bar>&otherFile;</bar>
</foo>
</doc>
Wenn der XML-Parser die Datei liest, erweitert er die Entitätsreferenz und schließt die referenzierte XML-Datei als Teil des Inhalts ein.
Wenn die "otherFile.xml" enthält: <baz>this is my content</baz>
Dann würde das XML von einem XML-Parser ausgewertet und "gesehen" als:
<?xml version="1.0" standalone="no" ?>
<doc>
<foo>
<bar><baz>this is my content</baz></bar>
</foo>
</doc>
Einige Referenzen, die hilfreich sein könnten:
XMLResolver
Eigenschaft festgelegt ist. Wenn die XMLResolver-Eigenschaft für Ihr XMLDocument-Objekt nicht festgelegt ist, werden möglicherweise keine externen Ressourcen geladen. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Die anderen Antworten beziehen sich auf die beiden gängigsten Ansätze, Xinclude und XML, externe Entitäten. Microsoft hat eine wirklich gute Beschreibung, warum man Xinclude bevorzugen sollte, sowie einige Beispielimplementierungen. Ich habe den Vergleich unten zitiert:
Per http://msdn.microsoft.com/en-us/library/aa302291.aspx
Warum XInclude?
Die erste Frage lautet: "Warum XInclude anstelle von externen XML-Entitäten verwenden?" Die Antwort lautet, dass externe XML-Entitäten eine Reihe bekannter Einschränkungen und unbequemer Auswirkungen haben, die effektiv verhindern, dass sie eine allgemeine Einschlussfunktion darstellen. Speziell:
- Eine externe XML-Entität kann kein vollständig unabhängiges XML-Dokument sein. Weder eine eigenständige XML-Deklaration noch eine Doctype-Deklaration sind zulässig. Dies bedeutet effektiv, dass eine externe XML-Entität selbst keine anderen externen Entitäten enthalten kann.
- Eine externe XML-Entität muss wohlgeformtes XML sein (auf den ersten Blick nicht so schlecht, aber stellen Sie sich vor, Sie möchten Beispiel-C # -Code in Ihr XML-Dokument aufnehmen).
- Das Nichtladen einer externen Entität ist ein schwerwiegender Fehler. Jede Wiederherstellung ist strengstens untersagt.
- Es kann nur die gesamte externe Entität einbezogen werden. Es gibt keine Möglichkeit, nur einen Teil eines Dokuments einzuschließen. -Externe Entitäten müssen in einer DTD oder einer internen Teilmenge deklariert werden. Dies öffnet eine Büchse der Pandora voller Implikationen, z. B. die Tatsache, dass das Dokumentelement in der Doctype-Deklaration benannt werden muss und dass für die Validierung von Lesern unter anderem das vollständige Inhaltsmodell des Dokuments in der DTD definiert werden muss.
Die Mängel bei der Verwendung externer XML-Entitäten als Einschlussmechanismus sind seit einiger Zeit bekannt und haben tatsächlich dazu geführt, dass Microsoft und IBM 1999 den XML-Einschlussvorschlag beim W3C eingereicht haben. Der Vorschlag definierte ein Verarbeitungsmodell und eine Syntax für eine universelle XML-Einschlussfunktion.
Vier Jahre später ist Version 1.0 der XML-Einschlüsse, auch als Xinclude bekannt, eine Kandidatenempfehlung. Dies bedeutet, dass das W3C der Ansicht ist, dass es umfassend überprüft wurde und die grundlegenden technischen Probleme erfüllt, die es lösen wollte, aber noch nicht erfüllt ist volle Empfehlung.
Eine weitere gute Website mit einer Vielzahl von Beispielimplementierungen ist https://www.xml.com/pub/a/2002/07/31/xinclude.html . Im Folgenden finden Sie ein Beispiel für einen allgemeinen Anwendungsfall auf ihrer Website:
<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>
Diese Funktion wird als XML-Einschlüsse (XInclude) bezeichnet . Einige Beispiele:
Die Lösung von Mads Hansen ist gut, aber um die externe Datei in .NET 4 erfolgreich lesen zu können, hat es einige Zeit gedauert, die Hinweise in den Kommentaren zu Resolvern, ProhibitDTD usw. zu verwenden.
So wird's gemacht:
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>