Frage

Ich habe zwei XML-Dokumente, die ich angelegt habe und ich möchte diese beiden innerhalb eines neuen Umschlag kombinieren. Also ich habe

<alert-set>
  <warning>National Weather Service...</warning>
  <start-date>5/19/2009</start-date>
  <end-date>5/19/2009</end-date>
</alert-set>

und

 <weather-set>
   <chance-of-rain type="percent">31</chance-of-rain>
   <conditions>Partly Cloudy</conditions>
   <temperature type="Fahrenheit">78</temperature>
 </weather-set>

Was möchte ich tun, ist, die zwei in einem Wurzelknoten verbinden: kombiniert docs

Ich habe versucht, ein temporären doc Erstellen und Kinder mit dem Wurzelknoten der Dokumente zu ersetzen:

<DataSet>
  <blank/>
  <blank/>
</DataSet>

Und ich hatte gehofft, dass die beiden Rohlinge mit den Wurzelelementen der beiden Dokumente zu ersetzen, aber ich erhalte „WRONG_DOCUMENT_ERR. Ein Knoten in einem anderen Dokument als das verwendet wird, die sie geschaffen“ Ich habe versucht, die Annahme und den Import der Wurzelknoten, aber ich bekomme den gleichen Fehler.

Gibt es nicht einige einfache Möglichkeit, Dokumente zu kombinieren, ohne durch lesen und mit neuen Elementen für jeden Knoten erstellen?

EDIT: Beispielcode-Schnipsel Ich versuche nur, um jetzt ein in die „leere“ Dokument zu bewegen ... Die importNode und adoptNode Funktionen können nicht importieren / nehmen Document Knoten, aber sie können nicht das Element Knoten und seine Unterstruktur importieren ... oder wenn es tut, tut es nicht scheint, zum Anfügen / ersetzen noch zu arbeiten.

    Document xmlDoc;     //created elsewhere
    Document weather = getWeather(latitude, longitude);
    Element weatherRoot = weather.getDocumentElement();

    Node root = xmlDoc.getDocumentElement();
    Node adopt = weather.adoptNode(weatherRoot);
    Node imported = weather.importNode(weatherRoot, true);
    Node child = root.getFirstChild();

    root.replaceChild(adopt, child);      //initially tried replacing the <blank/> elements
    root.replaceChild(imported, child);

    root.appendChild(adopt);
    root.appendChild(imported);
    root.appendChild(adopt.cloneNode(true));

Alle diese werfen die DOMException: WRONG_DOCUMENT_ERR: Ein Knoten in einem anderen Dokument als das verwendet wird, die es erstellt

.

Ich glaube, ich werde herausfinden müssen, wie stax zu verwenden oder einfach nur die Dokumente wieder gelesen und neue Elemente erstellen ... Das ein bisschen wie zu viel Arbeit scheint nur Dokumente zu kombinieren, though.

War es hilfreich?

Lösung

Es ist ein bisschen schwierig, aber das folgende Beispiel führt:

public static void main(String[] args) {

    DocumentImpl doc1 = new DocumentImpl();
    Element root1 = doc1.createElement("root1");
    Element node1 = doc1.createElement("node1");
    doc1.appendChild(root1);
    root1.appendChild(node1);

    DocumentImpl doc2 = new DocumentImpl();
    Element root2 = doc2.createElement("root2");
    Element node2 = doc2.createElement("node2");
    doc2.appendChild(root2);
    root2.appendChild(node2);

    DocumentImpl doc3 = new DocumentImpl();
    Element root3 = doc3.createElement("root3");
    doc3.appendChild(root3);

    // root3.appendChild(root1); // Doesn't work -> DOMException
    root3.appendChild(doc3.importNode(root1, true));

    // root3.appendChild(root2); // Doesn't work -> DOMException
    root3.appendChild(doc3.importNode(root2, true));   
}

Andere Tipps

Ich weiß, du hast das Problem bereits gelöst, aber ich wollte noch einen Stich an diesem Problem nehmen mit dem XOM Bibliothek, die ich zur Zeit an testet bin (bezogen diese Frage ), und dass, während tun, bietet einen anderen Ansatz als die Andreas_D Antwort.

(dieses Beispiel zu vereinfachen, habe ich Ihre <alert-set> und <weather-set> in separate Dateien, die ich in nu.xom.Document Instanzen.)

import nu.xom.*;

[...]

Builder builder = new Builder();
Document alertDoc = builder.build(new File("src/xomtest", "alertset.xml"));
Document weatherDoc = builder.build(new File("src/xomtest", "weatherset.xml"));
Document mainDoc = builder.build("<DataSet><blank/><blank/></DataSet>", "");

Element root = mainDoc.getRootElement();
root.replaceChild(
    root.getFirstChildElement("blank"), alertDoc.getRootElement().copy());
root.replaceChild(
    root.getFirstChildElement("blank"), weatherDoc.getRootElement().copy());

Der Schlüssel ist, eine Kopie der Elemente zu machen, eingefügt in mainDoc werden; sonst werden Sie ein beschweren bekommen, dass „Kind bereits einen Elternteil hat“.

Ausgabe mainDoc jetzt gibt:

<?xml version="1.0" encoding="UTF-8"?>
<DataSet>
    <alert-set>
        <warning>National Weather Service...</warning>
        <start-date>5/19/2009</start-date>
        <end-date>5/19/2009</end-date>
    </alert-set>
    <weather-set>
        <chance-of-rain type="percent">31</chance-of-rain>
        <conditions>Partly Cloudy</conditions>
        <temperature type="Fahrenheit">78</temperature>
    </weather-set>
</DataSet>

Zu meiner Freude stellte sich dies sehr erwiesen geradlinig mit XOM zu tun. Es dauerte nur ein paar Minuten zu schreiben, obwohl ich auf jeden Fall bin nicht sehr mit der Bibliothek noch erlebt. (Es wäre sogar noch einfacher, ohne die <blank/> Elemente, das heißt, mit einfach <DataSet></DataSet> starten).

Also, wenn Sie nur mit den Standard-JDK-Tools zwingende Gründe haben, ich versuche aus XOM wärmstens empfehlen, da diese XML machen kann in Java Handhabung viel angenehmer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top