org.w3c.dom.Element - Neues Element hinzufügen

AnnaBauer21

Mitglied
Hallo meine Lieben,

ich habe leider keine Lösung für mein Problem gefunden und mache deshalb ein neues Thema auf.

  • Ich versuche einen bestehenden Code aus C# in Java / Android umzusetzen.
  • Es geht darum eine XML einzulesen und ein neues Element hinzuzufügen.
  • In 'AddElement' wird dem übergebenen XElement (System.Xml.Linq.XElement) ein neus Element hinzugefügt.
  • Nachdem die 'AddElement' Methode verlassen wurde, ist das neue Element in 'xml' vorhanden und kann mit 'GetElement' ermittelt werden.
  • In Java / Android ist es anscheinend notwendig 'Document' zu verwenden um neue 'Element' Objekte zu erstellen.
  • In Java / Android habe ich nun das Problem, dass nach verlassen der 'AddElement' Methode das neue Element in 'xml' NICHT vorhanden ist
Testdaten Bsp.:
Code:
<root>
  <Ebene1>
    <Ebene2>
    <Ebene2>
  </Ebene1>
</root>

C# Code:
Code:
XElement xml = this.LoadXml("testdaten.xml");
this.AddElement(xml, "root/Ebene1/Ebene2", "NewElem", "Value");
XElement newElem = this.GetElement(xml, "root/Ebene1/Ebene2/NewElem")

Code:
private void AddElement(XElement xml, string relTagPath, string newElemName, string newElemValue = "")
{
  // Ermittelt, ob der angegebene Elementpfad dem obersten XML-Element entspricht
  XElement parentElem;
  if (relTagPath.Equals(xml.Name.ToString()))
  {
      parentElem = xml;
  }
  else
  {
      parentElement = this.GetElement(xml, relTagPath);
  }

  XElement newElem = new XElement(newElemName);
  if (!string.IsNullOrWhiteSpace(newElemValue))
  {
      newElem.SetValue(newElemValue);
  }

  parentElem.Add(newElem);
}

Java / Android Code:
Code:
Element xml = this.LoadXml("testdaten.xml");
this.AddElement(xml, "root/Ebene1/Ebene2", "NewElem", "Value");
Element newElem = this.GetElement(xml, "root/Ebene1/Ebene2/NewElem")

Code:
private void AddElement(Element xml, string relTagPath, string newElemName, string newElemValue = "")
{
  // Ermittelt, ob der angegebene Elementpfad dem obersten XML-Element entspricht
  Element parentElem;
  if (relTagPath.Equals(xml.Name.ToString()))
  {
      parentElem = xml;
  }
  else
  {
      parentElement = this.GetElement(xml, relTagPath);
  }

  Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
  doc.adoptNode(parentElem);

  Element newElem = doc.createElement(newElemName);
  if (!newElemValue.equals("")
  {
      newElem.SetTextContent(newElemValue);
  }

  parentElem.appendChild(doc.importNode(newElem, true);
}

Ich hoffe sehr, dass ihr mir helfen könnt!

Liebe Grüße
Anna
 
Zunächst mal schreibt man in Java Bezeichner von Variablen, Parametern und Methodennamen per Konvention in lowerCamelCase, von Typen dagegen UpperCamelCase.

Um ein Element zu erzeugen holst Du Dir per xml.getOwnerDocument() das Dokument:
Code:
Element newElement = xml.getOwnerDocument().createElement(newElemName);
...
newElement.setTextContent(...);
xml.appendChild(newElement);

Nachtrag: ersetze xml mit parenElement.
 
Hallo,

vielen Dank für eure Antworten!

@mihe7
Hab das Problem mit deiner Antwort jetzt lösen können.

Ich hatte zudem noch das Problem, dass ich veruscht habe nur mit 'Element' zu arbeiten und 'xml.getOwnerDocument()' null ergeben hat.
Ich habe nun auf oberster Ebene ein 'Document' erstellt, das root-Element ermittelt und dieses dann durch alle Methoden hinweg verwendet.

Vielen Dank! 😳
 

Zurück
Oben