it-swarm.com.de

Können wir XML-Dateien in andere XML-Dateien importieren?

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 den der Pfad bereitgestellt wird).

72
Sumit

Sie könnten eine externe (geparste) allgemeine Entität verwenden.

Sie deklarieren die Entität so:

<!ENTITY otherFile SYSTEM "otherFile.xml">

Dann verweisen Sie es so:

&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" Folgendes enthält: <baz>this is my content</baz>

Dann wird das XML ausgewertet und von einem XML-Parser als "gesehen":

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

Einige Hinweise, die hilfreich sein könnten:

84
Mads Hansen

Die anderen Antworten beziehen sich auf die zwei gebräuchlichsten Ansätze: Xinclude und externe XML-Entitäten. Microsoft hat eine großartige Kritik darüber, warum man Xinclude vorziehen sollte, sowie mehrere Beispielimplementierungen. Ich habe den Vergleich unten zitiert:

Per http://msdn.Microsoft.com/de-de/library/aa302291.aspx

Warum X einschließen?

Die erste Frage, die man sich stellen kann, lautet: "Warum XInclude anstelle von XML Externen Entitäten verwenden?" Die Antwort ist, dass externe XML-Entitäten eine .__ haben. Anzahl der bekannten Einschränkungen und unbequemen Auswirkungen, die effektiv verhindern, dass sie eine allgemeine Einbeziehung sind Einrichtung. Speziell:

  • Eine externe XML-Entität kann kein umfassendes unabhängiges XML-Dokument sein. Weder eine eigenständige XML-Deklaration noch eine Doctype-Deklaration ist dürfen. Dies bedeutet effektiv, dass eine externe XML-Entität selbst nicht andere externe Entitäten einschließen.
  • Eine externe XML-Entität muss wohlgeformtes XML sein (auf den ersten Blick nicht so schlimm, aber Sie möchten sich vorstellen, dass Sie C # -Code-Code in Ihr XML-Dokument einfügen möchten.).
  • Ein Fehler beim Laden einer externen Entität ist ein schwerwiegender Fehler. Jede Wiederherstellung ist strengstens verboten.
  • Es kann nur die gesamte externe Entität enthalten sein, 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, die eine Fülle von Implikationen aufweist, beispielsweise die Tatsache, dass Das Dokumentelement muss in der Doctype-Deklaration angegeben werden und das Für die Validierung von Lesern kann es erforderlich sein, dass das vollständige Inhaltsmodell von Dokument in der DTD ua definiert werden.

Die Mängel bei der Verwendung von externen XML-Entitäten als Inklusion Mechanismen sind seit einiger Zeit bekannt und haben tatsächlich die .__ hervorgebracht. Einreichung des Vorschlags zum Einschluss von XML beim W3C im Jahr 1999 durch Microsoft und IBM. Der Vorschlag definierte ein Verarbeitungsmodell und eine Syntax für eine allgemeine XML-Inklusionseinrichtung.

Vier Jahre später wurde Version 1.0 der XML Inclusions, die auch als .__ bezeichnet wird. Xinclude ist eine Kandidatenempfehlung, was bedeutet, dass das W3C ist der Auffassung, dass es umfassend überarbeitet wurde und die grundlegenden Anforderungen erfüllt technische Probleme, die gelöst werden sollten, ist aber noch nicht vollständig Empfehlung.

Eine weitere gute Site, die eine Vielzahl von Beispielimplementierungen bietet, ist https://www.xml.com/pub/a/2002/07/31/xinclude.html . Nachfolgend finden Sie ein häufig verwendetes Anwendungsbeispiel von ihrer 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>
20
VoteCoffee
12

Die Lösung von Mads Hansen ist gut, aber um die externe Datei in .NET 4 lesen zu können, dauerte es einige Zeit, bis sie mit Hinweisen in den Kommentaren zu Resolvern, ProhibitDTD und so weiter herauskam.

So wird es 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>
0
user3717478