Подтвердить что ты не робот

Как добавить node в существующий файл XML в 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);

      }

//Эта функция ниже - мне нужна помощь...

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

  }
Desired


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

Новое:

<Servers>

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

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

<Servers>
4b9b3361

Ответ 1

Следующий полный пример будет читать файл существующий server.xml из текущего каталога, добавить новый сервер и переписать файл на server.xml. Он не работает без существующего XML файла, поэтому вам нужно будет изменить код для обработки этого случая.

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

Пример файла server.xml:

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

Основное изменение вашего кода не создает новый "корневой" элемент. В приведенном выше примере используется только текущий корень node из существующего server.xml, а затем просто добавляется новый элемент Server и перезаписывается файл.

Ответ 2

Чтобы добавить новый элемент данных, просто сделайте это...

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

easy.... 'is' - это объект InputStream. отдых похож на ваш код.... попробовал это сейчас...

Ответ 3

Вы можете проанализировать существующий файл XML в DOM и добавить новые элементы в DOM. Очень похоже на то, что вы сделали с созданием нового XML. Я предполагаю, что вам не нужно беспокоиться о дублировании сервера. Если вам нужно беспокоиться об этом, вам придется пройти через элементы в DOM, чтобы проверить наличие дубликатов.

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).*/

Ответ 4

Если вам нужно вставить элемент node/в определенное место, вы можете сделать следующие шаги

  • Разделите исходный xml на две части.
  • Добавить новый node/элемент в качестве дочернего элемента для первого (первая часть должна заканчиваться элементом после того, как вы захотите добавить свой элемент)
  • Добавить вторую часть в новый документ.

Это простой алгоритм, но он должен работать...

Ответ 5

Вы можете использовать DOM4j.