web-dev-qa-db-fra.com

Comment puis-je ajouter un nœud à un fichier XML existant en Java

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);
}

C'est la fonction pour laquelle j'ai besoin d'aide:

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>

Voulait:

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

L'exemple complet suivant lit un fichier existant server.xml à partir du répertoire en cours, ajoute un nouveau serveur et réécrit le fichier dans server.xml. Il ne fonctionne pas sans un fichier .xml existant, vous devrez donc modifier le code pour gérer ce cas.

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; }
    }
}

Exemple de fichier server.xml:

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

La principale modification apportée à votre code est not créant un nouvel élément "racine". L'exemple ci-dessus utilise uniquement le nœud racine actuel du server.xml existant, puis ajoute simplement un nouvel élément Server et réécrit le fichier.

33
andyb

Pour ajouter un nouvel élément de données, procédez comme suit ...

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

easy .... 'is' est un objet InputStream. reste est similaire à votre code .... essayé tout à l'heure ...

5
silentkratos

Vous pouvez analyser le fichier XML existant dans le DOM et ajouter de nouveaux éléments au DOM. Très similaire à ce que vous avez fait avec la création d'un tout nouveau XML. Je suppose que vous n'avez pas à vous soucier du serveur en double. Si vous devez vous inquiéter à ce sujet, vous devrez passer en revue les éléments du DOM pour rechercher les doublons.

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

Si vous devez insérer un nœud ou un élément à un endroit spécifique, vous pouvez effectuer les étapes suivantes.

  1. Diviser le XML original en deux parties
  2. Ajoutez d'abord votre nouveau noeud/élément en tant qu'enfant (la première partie doit se terminer par un élément après lequel vous souhaitez ajouter votre élément)
  3. Ajouter la deuxième partie au nouveau document.

C'est un algorithme simple mais devrait fonctionner ...

0
Sergii Zagriichuk

Vous pouvez utiliser DOM4j qui fait ça.

0
Omnaest