Element manipulieren in einem DOMResult per XPath

Lowpass

Aktives Mitglied
Hallo zusammen
Als XPath-Anfänger bin ich gerade völlig verwirrt und konfus. Ich komm einfach nicht drauf, wie man das machen kann. Anstatt Code zu posten, beschränke ich mich auf die Problembeschreibung:

Ich erhalte ein Objekt und marshal das zu einem DOMResult.

Ich habe einen XPath-Ausdruck als String, der auf ein Element in diesem DOMResult verweist - und den Inhalt dieses Elements möchte ich ändern.

Wie kann ich das (mit dem javax.xml.xpath-Paket) machen?
Die Hauptschwierigkeit habe ich momentan damit, dass ich ja den Inhalt des Elements nicht einfach auslesen will, sondern ihn ändern möchte.

Freue mich sehr über Hilfe.
 

Lowpass

Aktives Mitglied
Danke für die Antwort.
Soweit ich gesehen habe, kann ich ganz einfach ein Document erzeugen per Casting aus dem DOMResult-Objekt (result):

Java:
Document doc = (Document)result.getNode()

Was ich dann aber machen will, ist ja nicht einfach ein parsen, sondern die gezielte Veränderung eines Attributs (nicht Element - ich war im Eingangspost zu undeutlich) per XPath und ich möchte das wenn möglich mit den Werkzeugen machen, die mir javax.xml + Subpackages zur Verfügung stellt.
 

Niki

Top Contributor
Vielleicht hilft dir das ja weiter:

Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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 javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XPathParser {

	private Document doc = null;

	public XPathParser(InputStream is) throws SAXException, IOException,
			ParserConfigurationException {
		DocumentBuilderFactory domFactory = DocumentBuilderFactory
				.newInstance();
		domFactory.setNamespaceAware(true);
		DocumentBuilder builder = domFactory.newDocumentBuilder();
		doc = builder.parse(is);
	}

	public void save(OutputStream os) throws TransformerException {
		TransformerFactory transformerFactory = TransformerFactory
				.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
		StreamResult result = new StreamResult(os);
		transformer.transform(source, result);
	}

	public void setName(String s) throws ParserConfigurationException,
			SAXException, IOException, XPathExpressionException {
		XPath xpath = XPathFactory.newInstance().newXPath();

		XPathExpression expr = xpath.compile("/response/result");

		NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

		Node node = nl.item(0);
		NamedNodeMap nnm = node.getAttributes();
		nnm.getNamedItem("name").setNodeValue(s);

	}

	/**
	 * @param args
	 * @throws ParserConfigurationException
	 * @throws IOException
	 * @throws SAXException
	 * @throws XPathExpressionException
	 * @throws TransformerException 
	 */
	public static void main(String[] args) throws SAXException, IOException,
			ParserConfigurationException, XPathExpressionException, TransformerException {
		File f = new File("xpath.xml");
		XPathParser xpp = new XPathParser(new FileInputStream(f));

		xpp.setName("new name");

		xpp.save(new FileOutputStream(f));

	}
}

und das XML:

Java:
<?xml version="1.0" encoding="UTF-8"?>
<response>
	<result name="foobar">

	</result>
</response>
 

Lowpass

Aktives Mitglied
@Noctarius: Da habe ich mich undeutlich ausgedrückt. Natürlich ist mir das klar, dass ich mit einem XPath-Ausdruck keine direkte Manipulation vornehmen kann. Wenn ich die Nodelist kriege, ist das für mich wunderbar... die Frage war eben: wie komme ich dahin. Ich bin irgendwie durcheinander gekommen mit verschiedenen Packages, verschiedenen Klassen und Methoden.
Danke für den Link. Das entspricht auf den ersten Blick genau dem was ich suche.

@Niki: Das sieht sehr gut aus. Danke. Versuche das grad umzusetzen.
 

Lowpass

Aktives Mitglied
Es will einfach nicht funktionieren. :(
Ich muss den Code vor dem Posten etwas verfremden. Ich hoffe, dadurch entstehen keine zusätzlichen Fehler.

Java:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ns3:Root xmlns:ns3="http://www.url.com/dto">
<control route="0"/>
</ns3:Root>

Und hier der dazugehörige Code in 2 verschiedenen Varianten:
Java:
org.w3c.dom.Document doc = (Document)result.getNode();
javax.xml.xpath.XPath xpath = XPathFactory.newInstance.newXPath();
org.w3c.dom.Node route = (Node)xpath.evaluate("Root/control/@route", doc, XPathConstants.NODE)
route ist immer null, auch wenn ich z.B. als XPath "Root/control" angebe, oder "ns3:Root/control".

Die zweite Variante:
Java:
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("Root/control/@route");
NodeList nl = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
Node node = nl.item(0);
Hier ist node jeweils null.

Ich habe versucht, einen NamespaceContext zu setzen, indem ich ein anonymes Objekt vom Typ NamespaceContext erzeugt habe, das mit getNamespaceUri("ns3") den String "http://www.url.com/dto" zurückliefert und bei getPrefix(...) das umgekehrte. Diesen habe ich dann per xPath.setNamespaceContext gesetzt. Das hat nichts gebracht.
 

Niki

Top Contributor
probiers mal ohne dem Attribut aus, also:

Java:
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("/Root/control");
NodeList nl = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
Node node = nl.item(0);

dann müsstest du das control Element bekommen. Und dann:

Java:
NamedNodeMap nnm = node.getAttributes();
nnm.getNamedItem("route").setNodeValue("was auch immer");

//EDIT
mach mal einen Slash vor dem Root
 

Lowpass

Aktives Mitglied
Habe inzwischen in beiden Varianten schon viel Erdenkliches ausprobiert... mit Slash vorne dran, ohne Attributname... versucht, erstmal auf den Root-Node zuzugreifen etc.
Das Resultat ist immer das gleiche: null.

Ich habe extra im Code noch den Inhalt des Documents ausgegeben um zu sehen, ob überhaupt was drin ist oder da der Hund begraben liegt - aber das XML hat genau die erwartete Struktur...

bin echt ratlos... ???:L

EDIT: Ah ja - und den XPath habe ich im XMLSpy geprüft. Müsste stimmen...

EDIT EDIT: Liegt es am Namespace ns3, der mir in die Quere kommt? Muss ich da noch irgend etwas konfigurieren, damit der richtig gelesen wird? Habe grad gesehen, dass XMLSpy vor meinen XPath noch ein "ns3" hängt... im JavaCode bringt ns3:Root allerdings nicht viel...
 
Zuletzt bearbeitet:

Niki

Top Contributor
So sollte es klappen:

Java:
		 XPath xpath = XPathFactory.newInstance().newXPath();	  
		
		 xpath.setNamespaceContext( new NamespaceContext( ){
			 public String getNamespaceURI(String prefix) {
				return "http://www.url.com/dto";
			}
			 public String getPrefix(String namespaceURI) {
				return "ns3";
			}
			 public Iterator getPrefixes(String namespaceURI) {
				List l = new ArrayList();
				l.add("ns3");
				return l.iterator();
			}
		 });


		XPathExpression expr = xpath.compile("/ns3:Root/control");
 

Lowpass

Aktives Mitglied
Oh mann... *anDenKopfFass*
Da kann ich natürlich noch lange ein anonymes NamespaceContext-Objekt erstellen, wenn ich nachher im XPath-String das Namespace-Prefix nicht angebe.

Ja. Jetzt funktionierts.... *uff*... herzlichen Dank an alle, die mitgeholfen haben. :)

PS: Der Slash am Anfang des XPath-Ausdrucks ist nicht nötig.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 jaxb XML Mapper - Root Element mit Attribut XML & JSON 20
B DOMParser - Element filtern XML & JSON 1
N jdom2 - Referenz auf Nested Element XML & JSON 2
H XML Element `Class` wird nicht gelesen XML & JSON 2
F xml Element ersetzen XML & JSON 5
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
W XML-Element komplett löschen XML & JSON 5
L XML nur ein Element einlesen XML & JSON 2
R XSD in einer choice mehrmals das selbe element möglich XML & JSON 5
S JDom XML ein Element hinzufügen. XML & JSON 1
ARadauer xsd ref auf element oder typen verwenden? XML & JSON 2
R cvc-complex-type.3.2.2: Attribute 'uuid' is not allowed to appear in element 'jasperReport'. XML & JSON 4
F EMF, XSD to ECore mapping, Attribute vs. Element XML & JSON 2
C xml validierung gegen xsd mit jdom: Fehlermeldung Cannot find the declaration of element ... XML & JSON 8
Landei JAXB: Wert von übergeordneten Element XML & JSON 4
N Alle namespaces ins Root Element hinauf ziehen XML & JSON 2
N Alle namespaces ins Root Element hinauf ziehen XML & JSON 2
S Validierung mit JAXB2 ohne root-element XML & JSON 10
E xml Element sortieren XML & JSON 2
T Xpath & JDOM Element Pfad ausgeben XML & JSON 2
Z XML parsen - Element mit Werten XML & JSON 2
enne87 Element-Werte werden falsch ausgelesen XML & JSON 2
M XSD - Child Element möglich, aber nicht zwingend erforderlich XML & JSON 6
N Individuelles Wrapper-Element um Collection mit JAXB XML & JSON 6
W Element mit XPath @id ermitteln wenn nur ein teil der id bekannt ist XML & JSON 2
R Element - Ausgeben von Kommentar XML & JSON 4
G mit Transformer.transform ein Element überschreiben XML & JSON 2
G XSL: Element über eine Variable ermitteln XML & JSON 4
sparrow JDom Element.getChild("Name") liefert null obwohl vorhanden XML & JSON 4
B XML-Element als String ausgeben XML & JSON 5
L Element einlesen <Telefon name="Karl">134313 XML & JSON 2
S Cannot find the declaration of element XML & JSON 2
M Jaxb Annotationen, Wert als XML Element XML & JSON 2
O XML Element mit ":" im Namen XML & JSON 23
G Element mit Text und Unterelement XML & JSON 2
S Ampersand im Jdom-Element XML & JSON 2
C jdom.Element nicht vorhanden? XML & JSON 4
W JDOM element ändern funzt nich :( [problem gelöst] XML & JSON 3
M XML einlesen - prüfen ob Element vorhanden XML & JSON 2
F choice-Element mit minOccurs=0" XML & JSON 11
X Xpath, alle Element die mit "user" beginnen auswäh XML & JSON 2
C Mehrere Element_Nodes zusammenfassen zu einem Element XML & JSON 9
K Auf bestimmtes Element im XML zugreifen XML & JSON 3
M JDOM und XPath, zu Element zugehörigen XPath-Ausdruck XML & JSON 5
H Adapter: String->Element bzw. Element->String XML & JSON 6
M JDOM Element ohne Inhalt kopieren ? XML & JSON 3
S String in element casten XML & JSON 2
S Element hinzufügen XML & JSON 2
B Element an bestimmter Stelle einfügen (JDOM) XML & JSON 8
S zum element Attribut xmlns zufügen XML & JSON 6
N bestimmtes Element auslesen - ich verzweifel XML & JSON 3
J [Newbie] [JDOM] Element aus XML entfernen klappt nicht XML & JSON 4
P [Solved] XSL: Element-Variable auslesen XML & JSON 2
Noar XSLT - Element-Wrapping XML & JSON 2
R JDOM Root-Element entfernen aber Rest behalten XML & JSON 10
S Element addContent(Element) gibts nicht XML & JSON 5
R node.getNodeValue() bringt mir komplettes CDATA-Element XML & JSON 3
W Element Liste in Root XML & JSON 5
D Text, String vor einem Root Element einfügen XML & JSON 2
W root element parsen,Hilfe! XML & JSON 5
E Element.setTextContent(String); Ersatz fuer Version 1.4? XML & JSON 3
A NullPointerException bei leerem Element XML & JSON 4
D XML: Element section content does not follow the DTD XML & JSON 6
clemson element mit id in jdom löschen XML & JSON 2
A Element an einer bestimmten Stelle einfügen (nicht am Ende) XML & JSON 4
R JDom: XML Code von Element, und: ist Element ein standalone XML & JSON 2
G XML Tag beim Einlesen manipulieren XML & JSON 2
S Welche Zeichen sind erlaubt bei einem XML - Attributsnamen? XML & JSON 2
E Die Lösung mit einem XML-Viewer XML & JSON 12
B Wie kann man das ecncoding in einem vorhandenen Document-Objekt ändern? XML & JSON 2
A Elemente aus mehreren XML-Dateien zu einem zusammenfügen XML & JSON 5
J Anzahl der Elemente in einem XML-Dokument auslesen XML & JSON 7
J wert IN einem tag einlesen/schreiben XML & JSON 4
I XSL-FO mehrere Reports in einem PDF XML & JSON 3
B Problem beim löschen von ChildNodes aus einem XML-DOM XML & JSON 3
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
X Einzelne Tags rausnehmen aus einem großen XML-file XML & JSON 4
S leading whitespaces nach einem XMLOutputter XML & JSON 9
P Aus einem Node ein Document erstellen XML & JSON 2
A Internetinhalte auslesen und in einem XML-File speichern XML & JSON 4
P Knoten-Attribute einer xsd-Datei in einem JTree auslesen XML & JSON 18
A XML Dokument aus einem Schema ableiten/generieren? XML & JSON 6
H Nach einem Attribut suchen und dann löschen XML & JSON 3

Ähnliche Java Themen

Neue Themen


Oben