webentwicklung-frage-antwort-db.com.de

Wie füge ich einen Knoten an eine vorhandene XML-Datei in Java an?

public static void addALLToXML(Collection<Server> svr) throws IOException,
      ParserConfigurationException, TransformerException
{
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
        .newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory
        .newDocumentBuilder();
    Document document = documentBuilder.newDocument();

    // Root Element
    Element rootElement = document.createElement("Servers");
    document.appendChild(rootElement);

    for (Server i : svr)
    {
        // server elements
        Element server = document.createElement("server");
        rootElement.appendChild(server);

        Element name = document.createElement("name");
        name.appendChild(document.createTextNode(i.getName()));
        server.appendChild(name);

        Element port = document.createElement("port");
        port.appendChild(document.createTextNode(Integer.toString(i.getPort())));
        server.appendChild(port);
    }

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    DOMSource source = new DOMSource(document);

    StreamResult result = new StreamResult("/home/user/server.xml");
    transformer.transform(source, result);
}

Dies ist die Funktion, bei der ich Hilfe brauche:

public static void addNodeToXML(String nameIn, String portIn)
      throws ParserConfigurationException, SAXException, IOException
{
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
            .newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory
            .newDocumentBuilder();

    /* parse existing file to DOM */
    Document document = documentBuilder
            .parse(new File("/home/user/server.xml"));

    // Root Element
    Element rootElement = document.createElement("Servers");
    document.appendChild(rootElement);

    // server elements
    Element server = document.createElement("server");
    rootElement.appendChild(server);

    Element name = document.createElement("name");
    name.appendChild(document.createTextNode(nameIn));
    server.appendChild(name);

    Element port = document.createElement("port");
    port.appendChild(document.createTextNode(portIn));
    server.appendChild(port);
}

Original:

<Servers>
 <server>
  <name>something</name>
  <port>port</port>
 </server>
 </Servers>

Gesucht:

<Servers> 
  <server>
   <name>something</name>
   <port>port</port>
  </server>
  <server>
   <name>something</name>
   <port>port</port>
  </server>
<Servers>
18
stackoverflow

Das folgende vollständige Beispiel liest eine vorhandene server.xml-Datei aus dem aktuellen Verzeichnis, fügt einen neuen Server hinzu und schreibt die Datei erneut in server.xml. Es funktioniert nicht ohne eine vorhandene XML-Datei. Daher müssen Sie den Code ändern, um diesen Fall zu behandeln.

import Java.util.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class AddXmlNode {
    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document = documentBuilder.parse("server.xml");
        Element root = document.getDocumentElement();

        Collection<Server> servers = new ArrayList<Server>();
        servers.add(new Server());

        for (Server server : servers) {
            // server elements
            Element newServer = document.createElement("server");

            Element name = document.createElement("name");
            name.appendChild(document.createTextNode(server.getName()));
            newServer.appendChild(name);

            Element port = document.createElement("port");
            port.appendChild(document.createTextNode(Integer.toString(server.getPort())));
            newServer.appendChild(port);

            root.appendChild(newServer);
        }

        DOMSource source = new DOMSource(document);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        StreamResult result = new StreamResult("server.xml");
        transformer.transform(source, result);
    }

    public static class Server {
        public String getName() { return "foo"; }
        public Integer getPort() { return 12345; }
    }
}

Beispieldatei server.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Servers>
  <server>
    <name>something</name>
    <port>port</port>
  </server>
</Servers>

Die Hauptänderung an Ihrem Code ist not, wodurch ein neues "root" -Element erstellt wird. Das obige Beispiel verwendet nur den aktuellen Stammknoten aus dem vorhandenen server.xml und hängt dann einfach ein neues Server - Element an und schreibt die Datei neu.

33
andyb

So fügen Sie ein neues Datenelement hinzu:.

Document doc = docBuilder.parse(is);        
Node root=doc.getFirstChild();
Element newserver=doc.createElement("new_server");
root.appendChild(newserver);

easy .... 'is' ist ein InputStream-Objekt. Rest ist ähnlich wie Ihr Code .... versuchte es gerade jetzt ...

5
silentkratos

Sie können die vorhandene XML-Datei in das DOM parsen und neue Elemente an das DOM anhängen. Sehr ähnlich wie bei der Erstellung von brandneuen XML-Dateien. Ich gehe davon aus, dass Sie sich nicht um doppelte Server kümmern müssen. Wenn Sie sich darüber Gedanken machen müssen, müssen Sie die Elemente im DOM durchgehen, um nach Duplikaten zu suchen.

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

/* parse existing file to DOM */
Document document = documentBuilder.parse(new File("exisgint/xml/file"));

Element root = document.getDocumentElement();

for (Server newServer : Collection<Server> bunchOfNewServers){
  Element server = Document.createElement("server");
  /* create and setup the server node...*/

 root.appendChild(server);
}

/* use whatever method to output DOM to XML (for example, using transformer like you did).*/
1
Alvin

Wenn Sie Knoten/Elemente an einer bestimmten Stelle einfügen müssen, können Sie die nächsten Schritte ausführen

  1. Teilen Sie das Original-XML in zwei Teile
  2. Füge deinen neuen Knoten/Element zuerst als untergeordnetes Element an (der erste Teil sollte mit einem Element enden, nach dem du dein Element hinzufügen möchtest)
  3. Hängen Sie den zweiten Teil an das neue Dokument an.

Es ist ein einfacher Algorithmus, sollte aber funktionieren ...

0

Sie könnten DOM4j verwenden.

0
Omnaest