2017-04-25 1 views
-1

Ich versuche, einen neuen Knoten in einen extingenten Knoten für N Male einzufügen, aber es funktioniert nicht für mich, folgendes ist, was ich tue:Wie füge ich einen neuen XML-Knoten innerhalb eines bestehenden Knotens mit Hilfe von Java ein

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
    Document doc = docBuilder.parse(filePath); 
    Node pNode = doc.getElementsByTagName(parentNode).item(0); 


    for (int i = 1; i <= count; i++) { 
     String nodeValue = value; 

     Element newNode = doc.createElement(childNode); 
     newNode.appendChild(doc.createTextNode(nodeValue)); 
     pNode.appendChild(newNode); 
      } 

Das ist, was ich zu erreichen versuchen:

<parentNode> 
 
<childNode> value1 </childNode> 
 
<childNode> value2 </childNode> 
 
... 
 
<childNode> valueN </childNode> 
 
</parentNode>

der Name des untergeordneten Knoten nicht ändern wird. Der übergeordnete Knoten ist kein Stammknoten. Kann mir bitte jemand helfen, herauszufinden, was ich vermisse.

Danke.

+1

Was läuft falsch? Hast du noch etwas anderes? Was sind die Variablen value und childNode in der for-Schleife? – James

Antwort

0

Ich habe das für Sie überprüft, es sieht so aus, als ob es wie erwartet funktioniert. Was Sie vielleicht verpasst haben ist, dass die Änderungen an Ihrem XML im Speicher passieren? Dies ist, was ich getan habe:

Eingabe XML-Datei

<rootNode> 
    <parentNode></parentNode> 
</rootNode> 

Java-Test-Klasse

import java.io.IOException; 
import java.io.StringWriter; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import org.junit.Test; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.xml.sax.SAXException; 

public class DocBuilderTest { 

    private String filePath = "src/test/resource/doc.xml"; 

    @Test 
    public void builder() 
     throws ParserConfigurationException, IOException, SAXException, TransformerException { 
     System.out.println(processFile("parentNode", "value", "childNode")); 
    } 

    private String processFile(String parentNode, String value, String childNode) 
     throws ParserConfigurationException, SAXException, IOException, TransformerException { 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     Document doc = docBuilder.parse(filePath); 
     Node pNode = doc.getElementsByTagName(parentNode).item(0); 

     for (int i = 0; i < 5; i++) { 
      String nodeValue = value + i; 

      Element newNode = doc.createElement(childNode); 
      newNode.appendChild(doc.createTextNode(nodeValue)); 
      pNode.appendChild(newNode); 
     } 

     return toPrettyPrintString(doc); 
    } 

    // From https://stackoverflow.com/a/139096/7421645 
    private String toPrettyPrintString(Document doc) throws TransformerException { 
     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
     // initialize StreamResult with File object to save to file 
     StreamResult result = new StreamResult(new StringWriter()); 
     DOMSource source = new DOMSource(doc); 
     transformer.transform(source, result); 
     return result.getWriter().toString(); 
    } 
} 

Die pretty print reference wenn die Datei bereits teilweise eingerückt ist.

und Ausgang

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<rootNode> 
    <parentNode> 
    <childNode>value0</childNode> 
    <childNode>value1</childNode> 
    <childNode>value2</childNode> 
    <childNode>value3</childNode> 
    <childNode>value4</childNode> 
    </parentNode> 
</rootNode> 

HINWEIS Diese Ausgabe gedruckt wird, nur um System.out system.out, ich habe die Eingabedatei nicht überschrieben. Sie müssten dazu eine FileWriter initialisieren.

+0

Danke, das hat bei mir funktioniert. Es scheint, ich habe Änderungen nur in den Speicher gemacht und nicht in eine Datei geschrieben. Dein Code hat mir geholfen. – SeleniumLearner

Verwandte Themen