# Node.setTextContent funktioniert nicht



## streeter (21. Jul 2012)

Servus,

ich habe eine Liste mit Elementnamen. Wird der Elementname innerhalb der einen XML-Datei gefunden, so soll der Elementname mit einem Wert (bisher einfach ein Dummywert aus einer Liste (EuList.java), später aus einer Datenbank) in eine andere XML-Datei geschrieben werden. 
Ich habe also eine Template-XML, in die der Wert eines Elements nur geschrieben werden soll, wenn das Element auch in der anderen XML gefunden wurde. Ich hoffe, dass ich mich verständlich ausgedrückt habe. 

Das Problem ist nun, dass das Schreiben in die Template-XML nicht funktioniert. Hier der Code:


```
//input file path
		final String announcementFilePath = "input.xml";
		//template file path
		final String templateFilePath = "EUAnnoucementTemplate.xml";
		//output file path
		final String outputFilePath = "EUAnnouncementXML_" + System.currentTimeMillis() / 1000 + ".xml";
		
		//list of contents
		EuList contentList = new EuList();
		
		//xPath expressions
		String templateExpression;
		String euExpression;
		
		//create parser
		EuParser parser = new EuParser();
		
		//copy template file
		parser.templateCopy(templateFilePath, outputFilePath);
		
		//select each element and parse value to EU announcement
		for(Map.Entry<String, String> entry : contentList.getNameValueMap().entrySet())
		{
			//value to insert
			templateExpression = entry.getKey();
			
			//xpath for eu file
			euExpression = "//" + templateExpression.substring(16, templateExpression.length()-1);
			
			//xPath results
			String announcementFileResult = (String) parser.parseFile(announcementFilePath, templateExpression, XPathConstants.STRING);
//			String euFileResult = (String) parser.parseFile(outputFilePath, euExpression, XPathConstants.STRING);
			
			//check whether required element is also in template and in announcement file
			if(announcementFileResult == "true")
			{
//				if(euFileResult != "")
//				{
					System.out.println(euExpression);
					Node euNode = (Node) parser.parseFile(outputFilePath, euExpression, XPathConstants.NODE);
					euNode.setTextContent(entry.getValue());
					System.out.println(euNode.getTextContent());
...
```

Hierbei wird die templateFilePath zunächst einfach in eine outputFilePath kopiert (das Template-File soll schließlich unberührt bleiben). 
Hierzu habe ich in EuParser.java eine einfache Kopier-Methode geschrieben: 


```
public void templateCopy(String templateFilePath, String newFilePath)
	{
		//set files
		File templateFile = new File(templateFilePath);
		File newFile = new File(newFilePath);
		FileReader in;
		FileWriter out;
	
		try
		{
			//create reader and writer
			in = new FileReader(templateFile);
			out = new FileWriter(newFile);
			
			//copy
			int c;
			while ((c = in.read()) != -1)
			{
				out.write(c);
			}

			//close readers
			in.close();
			out.close();
		}
...
```

Die parse-Methode sieht so aus:

```
public Object parseFile(String xmlFilePath, String expression, QName type)
	{		
		try 
		{
			//create DOM document
			Document xmlFile = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFilePath);
			
			//create xPath
			XPath xPath =  XPathFactory.newInstance().newXPath();
			XPathExpression xPathExpression = xPath.compile(expression);
			
			//return element value
			return xPathExpression.evaluate(xmlFile, type);
...
```

Ich habe die beiden xPathes getestet. Sie funktionieren. Die korreten Nodes werden sowohl im Template- als auch in der einzulesenden XML-Datei gefunden. Mit euNode.getTextContent wird der korrekte Wert ausgegeben. Mache ich ein euNode.setTextContent("HALLO") und gebe es dann per euNode.getTextContent aus, erscheint in der Konsole auch mein "HALLO". Aber im XML-File steht nach wie vor der alte Wert. 
Ich hoffe, dass ich alles ausreichend beschrieben habe und dass mir jemand bei meinem Problem helfen kann. Vielen Dank!


----------



## Marcinek (22. Jul 2012)

Hallo,

Das Dom Objekt ist eine in memory representation der XML datei. Wenn du hier Änderungen machen willst, dann musst du das Don Objekt mit einem XML weiter in die Datei schreiben. 

Du brauchst das template auch nicht wirklich auf Datei ebene koperen es reicht aus das als Dom zu laden und dann n in die neue Datei zu schreiben.


----------



## streeter (22. Jul 2012)

Danke schonmal. 
Ich weiß nur noch nicht, wie ich das anstellen soll. 
In der EuParser.java bekomme ich durch

```
return xPathExpression.evaluate(xmlFile, type);
```
die Node, die ich bearbeiten will. Dort kann ich dann per 

```
euNode.setTextContent(entry.getValue());
```
den gewünschten Text setzen. 
Schön und gut, nur wie bekomme ich die bearbeitete Node jetzt in mein XML?


----------



## streeter (23. Jul 2012)

Problem gelöst:


```
Document xmlFile = parser.getXmlFile();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer;
transformer = tf.newTransformer();
transformer.transform(new DOMSource(xmlFile), new StreamResult(new File(outputFilePath)));
```


----------

