XPath-Problem mit DOM4J

Frutz

Mitglied
Grüßt Euch,

in einer XML-Datei möchte ich ein bestimmtes Element an einer ganz bestimmten Stelle innerhalb eines Containers erstellen.
Ich komme mit einer X-Path-Anweisung allerdings nicht an die richtige Stelle. Die Struktur der Elemente ist dabei so, dass mein neues Element zwischen verschiedenen Elementen der gleichen Ebene platziert werden muss. Heißt also, ich kann es nicht ans Ende oder den Anfang stellen.

Zur Übersicht kurz die Struktur der XML:
[XML]
featureMember
Element Ebene 1/
Element Ebene 2
Element Ebene 3/
/Element Ebene 2
Element Ebene 1/
genau an diese Stelle soll das neue Element
Element Ebene 1/
Element Ebene 1/
[/XML]

Mein Quellcode sieht dabei folgendermaßen aus:
Java:
[...]
dat1id=(Attribute)dat1Iter.next();
   if((!dat1id.getText().contains(seq1))){
   dat1id.getParent().selectSingleNode("//NET:link").addElement("TEST");
[...]

Heißt also, er soll von einer Ebene zum Elternelement gehen, dort dann den bestimmten Knoten auswählen und auf der gleichen Ebene dieses Knotens direkt danach ein weiteres Element anhängen.

Zusätzlich habe ich noch das Problem, dass ich nach
Java:
selectSingleNode
kein Element mit
Java:
addElement
anhängen kann, warum ist mir noch nicht so ganz klar.

Ich hoffe, ich konnte mich verständlich ausdrücken und jemand weiß Rat.

Vielen Dank
Gruß
André
 

sylo

Bekanntes Mitglied
Hi

Wenn ich dich richtig verstanden habe, musst du einfach nur den XPath Ausdruck an die richtige Stelle lenken.

Dein Ausdruck müsste dann in deinem Fall ungefähr so lauten:
/featureMember/Element Ebene 1[1]

Wenn du diese Position hast, solltest du deinen Knoten direkt davor einfügen können.

Grüße
sylo
 

Frutz

Mitglied
Grüßt Euch,

sorry, dass ich jetzt erst antworte, saß noch an einem anderen Problem.

@sylo: Danke erst Mal, das funktioniert natürlich ich hatte einen Denkfehler.

Mein Problem besteht trotzdem weiterhin, ich kann das Element nicht an der richtigen Stelle einfügen. Vielleicht muss ich noch etwas ausholen.

Ich habe 2 XML(GML)-Dateien, diese haben verschiedene Elemente, darunter ein Element mit einer ID. Hauptziel ist es, beide Dateien am Ende zu einer XML zu vereinen. Das klappt auch so weit.

Das Problem ist nun, dass es in der 2. XML ein Element gibt, welches ich so in die 1. XML an eine ganz bestimmte Stelle übergeben muss (vorgegeben durch das X-Schema). Das ganze möglichst noch vor dem Vereinen.

Ich habe als erstes alle benötigten ID's der Elemente über X-Path angesprochen und in eine Liste gepackt:
Java:
List<?> TEMP1 = doc.selectNodes("//gml:featureMember//Element Ebene 1/Element Ebene 2/@id" );
		    
Attribute TempAttribut1 = null;				
ArrayList<Object> temp1 = new ArrayList<Object>();
	    	
for (Object object : TEMP1){
   TempAttribut1= (Attribute) object;
   temp1.add(TempAttribut1.getValue());
   System.out.println("TEMP1: "+TempAttribut1.getValue());}

Dann spreche ich das ganze über einen Iterator an und möchte unter bestimmten Bedingungen(fehlt hier noch), dass das Element an der entsprechenden Stelle eingefügt werden soll:

Java:
Iterator<?> temp1Iter=TEMP1.iterator();
Attribute temp1id = null;

while(temp1Iter.hasNext()){
	temp1id=(Attribute)temp1Iter.next();
	System.out.println("TEST: "+temp1id.getParent());
	temp1id.getParent().addElement("TEST");
			}

Mit oben dargestelltem Code bin ich so weit, dass ich folgende XML erhalte:
[XML]
feature Member
[...]
Element Ebene 1
Zielelement ist Kindelement von Element Ebene 1
[...]
[/XML]

rauskommen soll aber:
[XML]
feature Member
[...]
Element Ebene 1
Zielelement wird Geschwisterelement von Element Ebene 1, also ebenfalls Element in Ebene 1
[...]
[/XML]

Ich habe auch versucht, das Element direkt über XPath anzusprechen und dort ein neues Element einzufügen.
Der Code:
Java:
temp1id.selectNodes("//X-Path zu Element").addElement("TEST");
ist aber nicht gültig.

InsertBefore() habe ich auch versucht, aber das klappt auch nicht. (Da ich mit Eclipse arbeite, werden mir die möglichen Methoden angezeigt, InsertBefore() war nicht dabei)

Ich kann mir nicht vorstellen, dass das SO schwer ist, aber ich seh die Lösung einfach nicht. Hat noch jemand eine Idee?

Danke,
Gruß,
André
 

sylo

Bekanntes Mitglied
Hi

hab auch mal gerade ein wenig gegoogelt. Dieses Problem haben wohl andere auch :) Bei dom4j gibt es keine vergleichbare Methode wie insertBefore()

Das Einzige was ich auf die schnelle gefunden habe ist diese Möglichkeit:
Java:
parentElements.add(newPosition, newNode);
Vielleicht hilft dir das weiter.

Grüße
sylo
 

Frutz

Mitglied
Grüßt Euch,

@Sylo: Dank Dir - musst ich gar nicht ausprobieren, ich habe einen anderen Hinweis bekommen und dann hat es funktioniert.

Falls es mal jemand braucht:

Java:
Element featureElement = document.getRootelement();
Element newElement = DocumentHelper.createElement("new-element");
featureElement.content().add(4, newElement);

Das angesprochene Element muss dabei nicht zwangsläufig das Kind-Element des Wurzelknotens sein, man kann ein beliebiges Element auch über X-Path ansprechen und sich dann von dort entsprechend durchhangeln. Im Beispiel wird an der 5. Stelle ein Kindelement (new-Element) des Elements "feature-Element" eingefügt. Funktioniert auch wunderbar.

Daran anschließend hat sich aber ein weiteres Problem mit der XSL Transformation ergeben. Möchte nicht extra einen neuen Thread eröffnen und frag gleich hier noch.

Mit nachfolgendem Code-Teil transformiere ich eine XML mit XSLT.
Java:
javax.xml.transform.TransformerFactory tfactory=javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer=tfactory.newTransformer(
new javax.xml.transform.stream.StreamSource(new java.io.File(xslfinal)));
						
DocumentSource source = new DocumentSource (doc);
DocumentResult result = new DocumentResult();
transformer.transform(source, result);

Es geht dabei vor allem darum, zwei Dokumente durch die Transformation zu einem zusammenzufassen. In der Zieldatei erhalte ich dabei folgende Zeile (das ist das Element, welches ich, wie oben beschrieben, an die bestimmte Stelle einfügen musste. Das Problem trat auch dann erst auf, vorher funktionierte das Transformieren):

[XML]<NET:NET:link xmlns:NET="" xmlns:xlink="" xlink:xlink:href="..."/>[/XML]

Rauskommen sollte eigentlich:
[XML]<NET:link xlink:href="..."/>[/XML]

Führe ich die Transformation händisch (mit Altova XML Spy) aus, funktioniert sie reibungslos und ich erhalte den Fehler nicht.

Meine Frage: Kennt jemand dieses Problem und kann mir vielleicht sagen, wie ich das beheben kann?

Vielen Dank und viele Grüße,
André
 
Zuletzt bearbeitet:

Frutz

Mitglied
Kennt keiner dieses Problem?

Ich vermute mal, es liegt mit den vergebenen Namespaces zusammen. Ich habe schon verschiedene Varianten durchprobiert, von Namespace aus dem XSL Stylesheet herausnehmen, bis Namespace selbst beim Element hinzufügen.

Nützt alles nichts, der Fehler bleibt. Gibt es eine Möglichkeit, die Namespace innerhalb der Transformation zu ignorieren.

Mich wundert es halt, dass es bei einer manuellen Transformation mit Altova XML Spy keine Probleme gibt, während es bei der Transformation mit JAVA zu oben beschriebenem Problem kommt. Ist zwar nicht das einzige, aber in dem Fall sorgt es dafür, dass die XML nicht valid ist.

Über einen Hinweis wär ich dankbar.

Gruß,
André
 

sylo

Bekanntes Mitglied
Hallo Frutz

dem transformer kannst du noch ein paar Einstellungen mitgeben. Z.B. diese:
Java:
transformer.setOutputProperty("omit-xml-declaration", "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

Vielleicht liegt es dann an der formatieren deiner XML, dass es als nicht valide anerkannt wird.
Probier mal ein wenig rum. Normalerweise sollten die letzten zwei Zeilen reichen um deine XML-Datei zu formatieren.

Grüße
sylo
 

Frutz

Mitglied
Grüß Dich Sylo,

dank Dir für den Hinweis. Ein bisschen was kommt vielleicht sogar rein. Gerad das Pritty-Print (muss mal sehen, macht die Datei größer)

Aber ich glaube das Problem liegt noch woanders. Die Transformation klappt ja soweit gut - und solange ich die neuen Elemente nicht einfüge (siehe Ausgangspost und folgende), ist die Datei auch valid.

Wenn ich aber die neuen Elemente mittels JAVA einfüge (siehe Post vom 07. 08.), dann wird das Element "falsch" angelegt.

Und wie ich gerade sehe, habe ich das in meinem ersten Post nicht geschrieben.

Schon in der Ausgangsdatei (also noch vor der Transformation) werden die neuen Elemente "falsch" angelegt. Dort sieht das folgendermaßen aus:

[XML]
<NET:link xmlns="" xlink:href=.../>
[/XML]

Der Namespace [XML]xmlns=""[/XML] hat dort eigentlich nichts zu suchen bzw. muss dort nicht unbedingt hin, denn er ist schon im Wurzelelement definiert und das reicht. Es ist allerdings der richtige Namespace zu dem Element, DOM4J scheint ihn also einfach einzufügen. Die Datei ist auch valid, deshalb stört das nicht weiter.

Nach der Transformation, in der beide Dateien zusammengefasst werden, sieht es dann so aus:

[XML]
<NET:NET:link xmlns:NET="" xmlns:xlink="" xlink:xlink:href=.../>
[/XML]

Und das geht dann nicht mehr. Ich habe auch schon in der XSL-Datei versucht Namespace rauszunehmen, bringt aber alles nix. Das Ergebnis verändert sich zwar ein wenig, aber die Datei ist weiterhin nicht valid.

Weiterhin hab ich auch schon den Rat bekommen, die Namespace-Referenzen wegzulassen und habe den Namespace selbst an das Element angehangen. Alles ohne Erfolg.

Weißt Du oder jemand anders vielleicht, wie ich die Namespacebehandlung in DOM4J bzw. JAVAX für die Transformation unterdrücken kann? Vielleicht würde das schon helfen

Danke und Gruß,
André
 

Frutz

Mitglied
Grüßt Euch,

ich habe den entscheidenden Hinweis im DOM4J Forum bekommen.

Falls es mal jemand braucht:

Java:
Element newElement = DocumentHelper.createElement(QName.get("[Name des Elements]", "[Referenz zum Namensraum]"));
newElement.addAttribute(QName.get("[Name des Attributs]","[Referenz zum Namensraum]"),[Wert des Attributs]);

Man muss das Element bzw. das Attribut mit
Java:
QName
definieren und dabei die Referenz zum Namensraum hinzufügen. Dann funktioniert auch die Transformation.

Besten Dank für die Hilfe an Sylo und Gruß,
André
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O XPATH Problem - Anfänger XML & JSON 4
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
P XPath Problem XML & JSON 2
S Problem mit XPath XML & JSON 4
A XPath Problem XML & JSON 2
loadbrain XPath Problem XML & JSON 2
F JDOM und XPath - Problem mit Namespace ohne Prefix XML & JSON 5
M XPath Problem im Zusammenhang mit document() XML & JSON 2
M XPATH und RSS (Problem namespaces) XML & JSON 7
Kirby.exe Probleme mit XML XPATH Select XML & JSON 3
B XPath soll XML liefern XML & JSON 7
M dom4j unberechtigte Invalid XPath expression XML & JSON 12
W XPath schreiben XML & JSON 1
P HTML XPath XML & JSON 1
S Ersatz für die veraltete Klasse XPath XML & JSON 1
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
P Xpath zugriff auf Attribute XML & JSON 3
P "XPath is deprecated" XML eclipse XML & JSON 3
G HtmlUnit XPath XML & JSON 5
D XPath-Query XML & JSON 2
I XPath Namensräume und auslesen einzelner Knoten XML & JSON 3
AMStyles XPATH Befehl SVG Java XML & JSON 2
G xpath: in Kindelement zwei Attribut-Werte auslesen XML & JSON 2
G xpath: Inhalt eines Kindelements auslesen XML & JSON 2
H ChildNode via XPath ansprechen XML & JSON 2
G JDOM - aus Children-Liste ein Child direkt ansprechen ohne XPath? XML & JSON 9
S Attribute von Elementen auslesen mit XPath XML & JSON 2
T Xpath & JDOM Element Pfad ausgeben XML & JSON 2
W XPath + Inhalt aus <td> XML & JSON 2
R XPath - frage zur Adressierung XML & JSON 3
reibi XPath XML & JSON 14
M xPath liefert leeres Nodeset XML & JSON 2
M Probleme mit XPath bei Java XML & JSON 5
W Element mit XPath @id ermitteln wenn nur ein teil der id bekannt ist XML & JSON 2
O XPATH gesucht XML & JSON 6
G XPATH-Frage XML & JSON 2
L Element manipulieren in einem DOMResult per XPath XML & JSON 10
P XPath und Namespaces XML & JSON 3
G XPath - replace function funktioniert nicht XML & JSON 3
E XPATH-Ausdruck mit not XML & JSON 4
E Wieso liefert dieser XPATH-Ausdruck nicht die richtige Anzahl Treffer? XML & JSON 8
M XPath Ausdruck validieren XML & JSON 2
N XPath Adressierung XML & JSON 7
F XPath frage XML & JSON 4
B Optionaler XPath pfad XML & JSON 2
B XPath frage XML & JSON 2
T Frage zu XQuery (XQJ) / XPath XML & JSON 2
T Mit XPATH finden und dann änder XML & JSON 2
T EXSD auslesen mit XPath und JDOM XML & JSON 8
G XPath gesucht für Tag mit konkretem Content XML & JSON 2
C XPath in JDOM klappt nicht XML & JSON 2
T Prbolem XPath XML & JSON 2
X Xpath, alle Element die mit "user" beginnen auswäh XML & JSON 2
M brauche große XML-Datei für XPath-Tests XML & JSON 4
M JDOM und XPath, zu Element zugehörigen XPath-Ausdruck XML & JSON 5
F hilfe bei xpath-ausdruck XML & JSON 2
K java + xpath -> performanceproblem XML & JSON 9
H Xpath kindelemente auslesen XML & JSON 2
S Xml zurück in xpath wandeln XML & JSON 8
G Frage zu XPath XML & JSON 2
flashfactor Filtern mittels XPATH XML & JSON 4
M XSL/XPath - Nur ersten Wert mit selben Attribut XML & JSON 4
M Frag zu xsl:when beziehungsweise XPath XML & JSON 3
F JDom und XPath XML & JSON 12
C xpath funktioniert nicht XML & JSON 5
P nochmal XPath :-) XML & JSON 22
P XPath . XML & JSON 2
T Rekursiver Verzeichniss Baum in XML & XPath XML & JSON 4
clemson xpath mit jdom XML & JSON 2
Wildcard xpath Parser XML & JSON 8
so_ein_Komischer Problem mit Clean and Build XML & JSON 1
P JAXB-Problem XML & JSON 1
W Problem mit dem mit XML sortierung XML & JSON 2
S Jaxb Unmarshalling Problem XML & JSON 4
E einfaches Problem XML + XSD + jedit XML & JSON 2
S Xslt Problem XML & JSON 2
B JasperReport Problem in Runtime XML & JSON 2
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
R Problem bei: XML und XSL zu HTML XML & JSON 2
M Read / write Problem beim ByteStrom XML & JSON 2
M XML write Problem zweiter Ansatz XML & JSON 3
M XML read Problem XML & JSON 4
M XML write Problem XML & JSON 2
whitenexx Problem beim parsen von Facebook XML XML & JSON 3
M XML Unicode Problem XML & JSON 2
S XJC --> Java-Objects compile Problem XML & JSON 4
B JPA + JAXB Mapping Problem XML & JSON 2
G Problem beim schreiben von XML in eine File XML & JSON 2
S Encoding Problem XML & JSON 7
K JAXB und Maps -> Marshalling-Problem XML & JSON 6
B Problem beim löschen von ChildNodes aus einem XML-DOM XML & JSON 3
E JDOM - Problem beim Zusammenfügen zweier Dateien XML & JSON 2
M JExcelAPI (JXL) Encoding Problem XML & JSON 11
S DOM Parsen Problem mit HTML Sonderzeichen XML & JSON 4
A aus xml --> html Problem XML & JSON 3
Y stax Problem XML & JSON 3
slawaweis Problem mit XSLT (wahrscheinlich ein Bug in Java 6) XML & JSON 16
T Problem beim Parsen von Attribut xmlns="urn:com:test&qu XML & JSON 6
J Problem beim XML-Lesen XML & JSON 2
M Problem mit FOP in Java Programm XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben