# Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen



## Meri (3. Aug 2016)

Hallo Zusammen,
ich weiß zu diesem Thema sind schon mehrere Themen offen, aber zu meinem aktuellen Fall finde ich keins, welches mir weiterhilft, deshalb muss ich doch ein eigenes auf machen.

Und zwar handelt es sich um eine XML-Datei (genauer gesagt sogar kml, was aber wie xml behandelt werden kann), in welcher ich bei einem bestimmten Zweig den Text vom Attribut ändern will.
Siehe folgendes Beispiel:


```
<?xml version="1.0" encoding="UTF-8" standalone="no"?><kml xmlns="http://earth.google.com/kml/2.2">
<Document>
  <name>Mapperz;</name>
  <description><![CDATA[Testing out the new My Maps Service from Google Maps]]></description>
<Style id="style5">
    <LineStyle>
      <color>40000000</color>
      <width>3</width>
    </LineStyle>
    <PolyStyle>
      <color>73FF0000</color>
      <fill>1</fill>
      <outline>1</outline>
    </PolyStyle>
  </Style>
<Placemark>
    <name>Shape 1</name>
    <description/>
    <styleUrl>#style5</styleUrl>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
         <coordinates>
        -118.7850000,34.0623400,0.000000
        -118.7843501,34.0423400,0.000000
        </coordinates>
        </LinearRing>
      </outerBoundaryIs>
    </Polygon>
  </Placemark> 
<Placemark>
    <name>Shape 2</name>
    <description/>
    <styleUrl>#style5</styleUrl>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
        <coordinates>
        -118.7850000,34.0623400,0.000000
        -118.7843501,34.0423400,0.000000
        -118.7920000,34.0522227,0.000000
        </coordinates>
        </LinearRing>
      </outerBoundaryIs>
    </Polygon>
  </Placemark>
</Document>
</kml>
```

Ich möchte hier bei dem ersten 'Placemark' den name von "Shape 1" zu "Karte1" ändern.

Versucht habe ich es mit folgendem Code:

```
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filepath);
           
           
Node placemark = doc.getElementsByTagName("Placemark").item(0);
           
//update point from placemarks
NamedNodeMap nameAttr = placemark.getAttributes();
Node nameVal = nameAttr.getNamedItem("name");
nameVal.setTextContent("Karte1");
           
//write the content into kml file
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer trans = transFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(filepath));
trans.transform(source, result);
```

Aber er bringt mir dann immer eine "java.lang.NullPointerException" Fehlermeldung auf die Zeile 'nameVal.setTextContent("Karte1");' bezogen.

Ich wäre sehr dankbar über jeden Tip an was es liegen könnte.

------
Und meine Zweite Frage wäre noch, ob ihr eine Idee habt wie ich einen weiteren kompletten Element-Zweig einfügen kann, wie in diesemfall z.b. einen 'Placemark', da ich noch weitere Koordinatenfelder brauche zum darstellen, aber ich komm nicht drauf wie das machbar ist und finde auch garkeinen ansatz, da ja die kompletten Attribute und Werte bis auf die Koordinaten und der Name schon drinnen sein soll beim einfügen. Oder kopier ich da einfach einen vorhandenen Zweig und änder ihn, aber dan wäre ich wieder beim problem des änderns.


Bitte lasst mich nicht im Stich und hilft mir!


----------



## Flown (3. Aug 2016)

Normalerweise löst man sowas mit XSLT... Aber wenn du schon mit DOM arbeitest:

```
String kml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><kml xmlns=\"http://earth.google.com/kml/2.2\">\r\n" + 
    "<Document>\r\n" + 
    "  <name>Mapperz;</name>\r\n" + 
    "  <description><![CDATA[Testing out the new My Maps Service from Google Maps]]></description>\r\n" + 
    "<Style id=\"style5\">\r\n" + 
    "    <LineStyle>\r\n" + 
    "      <color>40000000</color>\r\n" + 
    "      <width>3</width>\r\n" + 
    "    </LineStyle>\r\n" + 
    "    <PolyStyle>\r\n" + 
    "      <color>73FF0000</color>\r\n" + 
    "      <fill>1</fill>\r\n" + 
    "      <outline>1</outline>\r\n" + 
    "    </PolyStyle>\r\n" + 
    "  </Style>\r\n" + 
    "<Placemark>\r\n" + 
    "    <name>Shape 1</name>\r\n" + 
    "    <description/>\r\n" + 
    "    <styleUrl>#style5</styleUrl>\r\n" + 
    "    <Polygon>\r\n" + 
    "      <outerBoundaryIs>\r\n" + 
    "        <LinearRing>\r\n" + 
    "          <tessellate>1</tessellate>\r\n" + 
    "         <coordinates>\r\n" + 
    "        -118.7850000,34.0623400,0.000000\r\n" + 
    "        -118.7843501,34.0423400,0.000000\r\n" + 
    "        </coordinates>\r\n" + 
    "        </LinearRing>\r\n" + 
    "      </outerBoundaryIs>\r\n" + 
    "    </Polygon>\r\n" + 
    "  </Placemark>\r\n" + 
    "<Placemark>\r\n" + 
    "    <name>Shape 2</name>\r\n" + 
    "    <description/>\r\n" + 
    "    <styleUrl>#style5</styleUrl>\r\n" + 
    "    <Polygon>\r\n" + 
    "      <outerBoundaryIs>\r\n" + 
    "        <LinearRing>\r\n" + 
    "          <tessellate>1</tessellate>\r\n" + 
    "        <coordinates>\r\n" + 
    "        -118.7850000,34.0623400,0.000000\r\n" + 
    "        -118.7843501,34.0423400,0.000000\r\n" + 
    "        -118.7920000,34.0522227,0.000000\r\n" + 
    "        </coordinates>\r\n" + 
    "        </LinearRing>\r\n" + 
    "      </outerBoundaryIs>\r\n" + 
    "    </Polygon>\r\n" + 
    "  </Placemark>\r\n" + 
    "</Document>\r\n" + 
    "</kml>";

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(kml)));

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
NodeList evaluate = (NodeList) xPath.evaluate("//Placemark/name/text()", doc, XPathConstants.NODESET);
for (int i = 0; i < evaluate.getLength(); i++) {
  Node nameNode = evaluate.item(i);
  nameNode.setNodeValue("Karte" + nameNode.getNodeValue().replaceAll("\\D*", ""));
}
NodeList evaluate2 = (NodeList) xPath.evaluate("//Placemark", doc, XPathConstants.NODESET);
for(int i = 0; i < evaluate2.getLength(); i++) {
  Node node = evaluate2.item(i);
  Element commentElement = doc.createElement("Comment");
  commentElement.setAttribute("hidden", "true");
  commentElement.appendChild(doc.createTextNode("my comment"));
  node.appendChild(commentElement);
}

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));
```


----------



## Meri (3. Aug 2016)

Danke für die schnelle Antwort.

Ich hätte da noch Rückfragen dazu:
und zwar warum baust du die komplette Datei neu auf? Hab ich indemfall vergessen zu sagen, dass es diese Datei bereits gibt und in dieser eben etwas geändert und eingefügt werden soll. -> aber ok ich hab es jetzt mal ausprobiert und es klappt genauso auch mit der datei, wie ich es davor auch gemacht hab.

Und zum anderen bzgl. des einfügen eines neuen Zweiges, damit hatte ich gemeint einen kompletten neuen Zweig 'Placemark' mit allen Attributten und unterpunkten, nicht nur ein Attribut dieses Zweiges. Wie würde ich das denn machen?

Und bzgl. des änderns, ist es auch möglich nur bei einem Zweig das zu ändern, also z.b. beim ersten Placemark den Text vom Namen komplett zu ändern und aber beim zweiten nicht?

Und wenn es mit xlst einfacher wäre, wie würde ich das angehen oder bräuchte ich dann wieder eigne libs dafür oder so? Aber ansonsten ok, es klappt ja so jetzt schon so gut wie.


----------



## Flown (3. Aug 2016)

Bei näheren Fragen HIER ein Tutorial von Mykong.


Meri hat gesagt.:


> und zwar warum baust du die komplette Datei neu auf? Hab ich indemfall vergessen zu sagen, dass es diese Datei bereits gibt und in dieser eben etwas geändert und eingefügt werden soll.


Du musst die Datei überschreiben, anders funktioniert das nicht.


Meri hat gesagt.:


> Und zum anderen wo genau in dem Code wird jetzt die änderung des Textes vorgenommen und wo das hinzufügen eines neuen Elements.


HIER:


Flown hat gesagt.:


> ```
> NodeList evaluate = (NodeList) xPath.evaluate("//Placemark/name/text()", doc, XPathConstants.NODESET);
> for (int i = 0; i < evaluate.getLength(); i++) {
> Node nameNode = evaluate.item(i);
> ...





Meri hat gesagt.:


> Und wenn es mit xlst einfacher wäre, wie würde ich das angehen oder bräuchte ich dann wieder eigne libs dafür oder so?


Mal ein wenig im Internet nach Tutorials suchen?! Zum Beispiel die von Oracle: XSLT.
Du brauchst keine externe Lib, ist alles mitgeliefert.

Ich hab nicht gesagt, dass es in XSLT einfacher wäre, nur das es eigentlich damit gemacht wird. Du kannst alles in DOM genau so erledigen (was ich dir auch raten würde, wenn du keine Ahnung von DOM/XPath hast).


----------



## Meri (3. Aug 2016)

Flown hat gesagt.:


> Du musst die Datei überschreiben, anders funktioniert das nicht.


Also es funktioniert bei mir aber sogar, ohne das überschreiben - hab es davor auch schon so gemacht.




Flown hat gesagt.:


> Ich hab nicht gesagt, dass es in XSLT einfacher wäre, nur das es eigentlich damit gemacht wird. Du kannst alles in DOM genau so erledigen (was ich dir auch raten würde, wenn du keine Ahnung von DOM/XPath hast).


Ok ja dan werde ich jetzt bei dem bleiben, da ich es schon fast hab. 

Zum ändern noch eine frage, kann ich auch nur in einem Zweig was ändern, indem ich z.b. sag es soll in dem zweig XY was ändern, welcher den name 'shape1' hat und diesen zu 'eins'?


----------



## Flown (3. Aug 2016)

Meri hat gesagt.:


> Also es funktioniert bei mir aber sogar, ohne das überschreiben - hab es davor auch schon so gemacht.


Aha und was glaubst du was:

```
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(filepath));
trans.transform(source, result);
```
 macht?


----------



## Meri (3. Aug 2016)

indemfall auch mein altes file überschreiben ?


----------



## Flown (3. Aug 2016)

Meri hat gesagt.:


> Zum ändern noch eine frage, kann ich auch nur in einem Zweig was ändern, indem ich z.b. sag es soll in dem zweig XY was ändern, welcher den name 'shape1' hat und diesen zu 'eins'?


Ein ganzes Beispiel nochmal (richtiges raussuchen mit XPath ist hier sehr hilfreich):

```
String kml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><kml xmlns=\"http://earth.google.com/kml/2.2\">\r\n" +
    "<Document>\r\n" +
    "  <name>Mapperz;</name>\r\n" +
    "  <description><![CDATA[Testing out the new My Maps Service from Google Maps]]></description>\r\n" +
    "<Style id=\"style5\">\r\n" +
    "    <LineStyle>\r\n" +
    "      <color>40000000</color>\r\n" +
    "      <width>3</width>\r\n" +
    "    </LineStyle>\r\n" +
    "    <PolyStyle>\r\n" +
    "      <color>73FF0000</color>\r\n" +
    "      <fill>1</fill>\r\n" +
    "      <outline>1</outline>\r\n" +
    "    </PolyStyle>\r\n" +
    "  </Style>\r\n" +
    "<Placemark>\r\n" +
    "    <name>Shape 1</name>\r\n" +
    "    <description/>\r\n" +
    "    <styleUrl>#style5</styleUrl>\r\n" +
    "    <Polygon>\r\n" +
    "      <outerBoundaryIs>\r\n" +
    "        <LinearRing>\r\n" +
    "          <tessellate>1</tessellate>\r\n" +
    "         <coordinates>\r\n" +
    "        -118.7850000,34.0623400,0.000000\r\n" +
    "        -118.7843501,34.0423400,0.000000\r\n" +
    "        </coordinates>\r\n" +
    "        </LinearRing>\r\n" +
    "      </outerBoundaryIs>\r\n" +
    "    </Polygon>\r\n" +
    "  </Placemark>\r\n" +
    "<Placemark>\r\n" +
    "    <name>Shape 2</name>\r\n" +
    "    <description/>\r\n" +
    "    <styleUrl>#style5</styleUrl>\r\n" +
    "    <Polygon>\r\n" +
    "      <outerBoundaryIs>\r\n" +
    "        <LinearRing>\r\n" +
    "          <tessellate>1</tessellate>\r\n" +
    "        <coordinates>\r\n" +
    "        -118.7850000,34.0623400,0.000000\r\n" +
    "        -118.7843501,34.0423400,0.000000\r\n" +
    "        -118.7920000,34.0522227,0.000000\r\n" +
    "        </coordinates>\r\n" +
    "        </LinearRing>\r\n" +
    "      </outerBoundaryIs>\r\n" +
    "    </Polygon>\r\n" +
    "  </Placemark>\r\n" +
    "</Document>\r\n" +
    "</kml>";

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new InputSource(new StringReader(kml)));

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
Node evaluate = (Node) xPath.evaluate("//Placemark[name=\"Shape 1\"]/name/text()", doc, XPathConstants.NODE);
evaluate.setNodeValue("eins");

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));
```


----------



## Meri (3. Aug 2016)

Also erst mal Danke und ja das für das Ändern klappt jetzt damit.

Beim einfügen eines weiteren Zweiges müsste es doch nach dem selben Prinzip auch gehen oder?
Ich hab es mal folgend versucht: 

```
Node evaluate2 = (Node) xPath.evaluate("//Placemark[name=\"Shape2\"]/name/text()", doc, XPathConstants.NODE);
Element commentElement = doc.createElement("Commentare");
commentElement.setAttribute("hidden", "true");
commentElement.appendChild(doc.createTextNode("my comment"));
evaluate2.appendChild(commentElement);
```

Aber es bringt mir immer folgenden Fehler:



> Exception in thread "main" org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: Es wurde versucht, einen Knoten an einer Stelle einzufügen, an der dies nicht zulässig ist.


----------



## Flown (3. Aug 2016)

Ich würde dir mal raten dich in XPath einzulesen, denn dann wüsstest du das du den "TextKnoten" mit `.../name/text()` selektiert hättest. Wenn du das `/text()` weglässt, dann bist du in dem "PlacemarkNode" mit dem Wert Name="Shape 2" und kannst an dieser Stelle dann einfügen.


----------



## Meri (3. Aug 2016)

ja aber ich wolte ja das komentar nicht in dem Feld name einfügen sondern, dazu als weiterer Punkt.
Genauso wie ich grad versuche bei dem zweiten 'Placemark' (also Shape2) ein weiteres Element unterhalb von 'LinearRing' einzufügen oder zu ändern, das es also z.b. folgend aussieht:

```
<Placemark>
    <name>Shabe2</name>
    <description/>
    <styleUrl>#style5</styleUrl>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
          <neuesElement>neuerText</neuesElement>
          <coordinates>-123,123,0.000000
             -456,456,0.000000
         </coordinates>
       </LinearRing>
      </outerBoundaryIs>
    </Polygon>
</Placemark>
```

Das Element 'neuesElement' ist neu und die coordinates sind geändert.

Das ändern der ersten coordinates, also vom ersten Placemark bekomme ich ja hin mit folgendem:

```
Node evaluate = (Node) xPath.evaluate("//Placemark/Polygon/outerBoundaryIs/LinearRing/coordinates/text()", doc, XPathConstants.NODE);
        evaluate.setNodeValue("-123,123,0.000000   -456,456,0.000000");
```
aber eben das für das zweite nicht, wo ich den namen angeben müsste von dem Placemark.


----------



## Flown (3. Aug 2016)

Du schaffst mich heute noch ... Machen wir mal was anders. Jetzt bauen wir uns händisch ein xml zusammen und somit decken wir jetzt alle Eventualitäten ab. Sozusagen ein Nachschlagewerk für dich:

```
import java.io.OutputStreamWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Test {
  public static void main(String... args) throws Exception {
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
    Document doc = docBuilder.newDocument();
    System.out.println("EMPTY DOCUMENT");
    print(doc);
    
    Element root = doc.createElement("root");
    doc.appendChild(root);
    System.out.println("ADDED ROOT");
    print(doc);
    
    for (int i = 0; i < 3; i++) {
      Element node = doc.createElement("element");
      node.setAttribute("id", Integer.toString(i));
      root.appendChild(node);
    }
    System.out.println("ADDED ELEMENTS AND ATTRIBUTES");
    print(doc);
    
    XPathFactory xPathFactory = XPathFactory.newInstance();
    XPath xPath = xPathFactory.newXPath();
    
    NodeList elements = (NodeList) xPath.evaluate("//element[@id=2 or @id=0]", doc, XPathConstants.NODESET);
    for (int i = 0; i < elements.getLength(); i++) {
      Node element = elements.item(i);
      Element comment = doc.createElement("comment");
      comment.appendChild(doc.createTextNode("here's my comment nr. " + Integer.toString(i)));
      element.appendChild(comment);
    }
    
    System.out.println("ADDED ELEMENT IN <element id=2> and <element id=0>");
    print(doc);
    
    System.out.println("EXTRACT THE COMMENTS");
    NodeList comments = (NodeList) xPath.evaluate("//comment/text()", doc, XPathConstants.NODESET);
    for (int i = 0; i < comments.getLength(); i++) {
      Node comment = comments.item(i);
      System.out.println(comment.getNodeValue());
    }
    
    Node elementWithId1 = (Node) xPath.evaluate("//element[@id=1]", doc, XPathConstants.NODE);
    elementWithId1.getParentNode().removeChild(elementWithId1);
    System.out.println("REMOVE AN ELEMENT: <element id=1>");
    print(doc);
  }
  
  private static void print(Document doc) throws Exception {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    
    transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));
  }
}
```
Das kannst du jetzt ausführen und durchgehen. Bei weiteren Fragen, Tutorials ansehen/lesen. Bei wirklich konreten Fragen kannst du dich gerne hier wieder melden.


----------



## Meri (3. Aug 2016)

Ja soweit habe ich das schon verstanden, viele Dank für die Mühe und die ausführliche Antwort, damit hast du mir schon viel weiter geholfen
Mein Problem ist aber folgendes, dass ich in meinem Fall die Koordinaten einfügen will in einen bestimmten Placemark Zweig. Die coordinates sind dem Element 'Polygon/outerBoundaryIs/LinearRing' untergeordnet, haben aber kein Attribut an welchem man diesen Zweig festmachen kann, der Placemark-Zweig ist nur über den 'name' bestimmt, somit muss also anhand des namens gefiltert werden, aber in einem neben unterzweig sollen die Coordinaten rein. Und wie filter ich nach dem namen, aber füge es in 'Polygon' ein?

Meine alternativ lösung wäre gewesen einfach komplett neue Placemarks einzufügen und den Inhalt mit den unterelementen komplett in das createTextNode("hier") zu packen, aber dort kann ich wieder die spitzen Klammern nicht mitgeben, mindestens hab ich mal nicht gefunden wie.


----------



## Flown (3. Aug 2016)

Kannst du mal kleine Testdaten mit vorher und nachher liefern? Ich versteh nicht was das Problem hier ist.


----------



## Meri (3. Aug 2016)

also so sieht das script vorher aus

```
<Placemark>
    <name>Shabe2</name>
    <description/>
    <styleUrl>#style5</styleUrl>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
          <coordinates>-11111,0.000000
             -111111.000000
         </coordinates>
       </LinearRing>
      </outerBoundaryIs>
    </Polygon>
</Placemark>
```
und so nach dem einfügen

```
<Placemark>
    <name>Shabe2</name>
    <description/>
    <styleUrl>#style5</styleUrl>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
          <neuesElement>neuerText</neuesElement>
          <coordinates>99999,0.000000
             -99999000000
         </coordinates>
       </LinearRing>
      </outerBoundaryIs>
    </Polygon>
</Placemark>
```
und davor und danach sind noch mehr placemark.


----------



## Flown (3. Aug 2016)

Der Code hierfür steht zig-mal in den obrigen Beiträgen:

```
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
Node evaluate = (Node) xPath.evaluate("//Placemark[name=\"Shabe2\"]//LinearRing", doc, XPathConstants.NODE);
Element element = doc.createElement("neuesElement");
element.appendChild(doc.createTextNode("neuerText"));
evaluate.appendChild(element);
```
Sieh dir bitte XPath an!!!!!!11111einseinself

Dann sieht das auch so aus:

```
<Placemark>
    <name>Shabe2</name>
    <description/>
    <styleUrl>#style5</styleUrl>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
          <coordinates>99999,0.000000
             -99999000000
         </coordinates>
         <neuesElement>neuerText</neuesElement>
        </LinearRing>
      </outerBoundaryIs>
    </Polygon>
</Placemark>
```


----------



## Meri (4. Aug 2016)

Flown hat gesagt.:


> Node evaluate = (Node) xPath.evaluate("//Placemark[name=[B]\"[/B]Shabe2*\"*]//LinearRing", doc, XPathConstants.NODE);


Diese Zeile war so nicht drin und da bin ich genau auch gehangen, wie ich die zusammen bau.
Vielen dank dafür!


----------

