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>
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.
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 ...
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).*/
Wenn Sie Knoten/Elemente an einer bestimmten Stelle einfügen müssen, können Sie die nächsten Schritte ausführen
Es ist ein einfacher Algorithmus, sollte aber funktionieren ...
Sie könnten DOM4j verwenden.