# Xml zurück in xpath wandeln



## Stefanru (11. Mai 2006)

Hallo,

ich bin neu hier, habe schon überall gesucht, google, hier und was weiß ich, aber finde leider nichts. 
Ich suche eine Möglichkeit ein XML Document komplett als Xpath Key / Value wiederzugeben.

Das ganze ist nötig weil ich eine Schnittstelle zwischen 2 Systemen programiere. Das eine System liefert mir eine Map mit Key / Value pairs. Der Key ist ein Xpath ausdruck. Diese Map wandle ich mit hilfe von Xpath in ein XML Document und übergebe es an das 2te System. Das klappt wunderbar. 
Nun muss ich auch noch den anderen Weg implementieren, ich bekomme von System 2 ein XML Document und muss es dem 1. System als Key / Value zur verfügung stellen, wobei der Key der Xpath ausdruck sein soll.

Hat hierzu einer eine Idee? Gibt es schon etwas fertiges? Habe da nichts gefunden. Oder muss ich mir das selbst mit DOM zusammenschreiben?

Schon mal vielen Dank im Vorraus
Gruß
Stefan


----------



## foobar (11. Mai 2006)

Wie du wandelst Xpath in Xml um? Mit Xpath ist eine Xml-Anwenung mit der du Knoten in einem XML-dokument selektieren kannst. 
Was konvertierst du denn da und zu welchem Zweck?


----------



## Stefanru (11. Mai 2006)

Hi, 

das ging ja schnell, danke für die Antwort.
Du hast das schon richtig gelesen ich erstelle aus XPATH Werten ein XML. 
Das leistet XPATH auch, ist zwar nicht so ganz der Sinn der Sache, aber ich brauche das halt so.

Ich mach mal ein Beispiel:
Ich bekomme von System 1 eine Map mit Key / Value paaren

Key                                                  |     Value
/Vertrag/Vertragsnummer                  |      0815
/Vertrag/Person/Vorname                  |      Stefan
/Vertrag/Person/Nachname                |      Test

Nun mache ich daraus mit Xpath ein XML
das sieht dann so aus 
<Vertrag>
  <Vertragsnummer>0815</Vertragsnummer>
  <Person>
     <Vorname>Stefan</Vorname>
     <Nachname>Test</Nachname>
  </Person>
</Vertrag>

Dieses XML geht an System 2. Dieses Speichert und kann alles mögliche damit machen.
Wenn ich nun wieder laden will geh ich an System 2 und bekomme das XML genau so wieder zurück.
Um es nun brauchbar für System 1 zu machen muss ich aus dem XML wieder zu der Key / Value Map kommen.
Leider weiß ich nicht wie ich das hinbekommen soll. Ich bräuchte also ein XML to Xpath.
Irgendeine Idee? Oder ist sowas nur schwierig möglich? Das Problem ist ich muss das ziemlich schnell fertig bekommen. Entweder gibt es was (bezweifle ich langsam fast),  ich hoffe ich kann was programieren mit DOM oder so, oder ich muss das ganze konzept nochmals überdenken für was es leider zu spät ist.

Gruß
Stefan


----------



## byte (11. Mai 2006)

Sind die XPath Ausdrücke alle so einfach wie in Deinem Beispiel? Also ohne relative Achsenbezeichner oder Attribute etc.? Dann könnte man sich das ja zur Not auch fix per Hand bauen. Also Du liest die XML-Datei z.B. mit (J)DOM ein und holst Dir dann rekursiv alle Pfade und speicherst sie jeweils als Strings gemäß der XPath-Syntax. Ist etwas frickelig aber sollte eigentlich recht schnell gehen.

Du musst halt bei jedem Element gucken ob es Kinder gibt. Falls ja, kommt ein rekursiver Aufruf mit jedem Kind. So baust Du Dir alle Pfade der XML-Datei auf und kannst Deine Name-Value Paare erzeugen. Hab mal sowas ähnliches gemacht, jedoch habe ich mir da die Pfade aus einem XML-Schema geholt und bin diese dann anhand der XML-Dokumente rekursiv "abgelaufen".


----------



## byte (11. Mai 2006)

Nachtrag: Es geht sogar noch einfacher sehe ich grade. Wenn Du JDOM verwendest, kannst Du getParent() auf ein Element anwenden. Das heisst, Du holst Dir erstmal alle Blätter des Baums (die XML Elemente ohne Kinder) und gehst dann einfach von hinten jeweils mit getParent() bis zum Root. Auf diese Weise kannst Du es sogar iterativ lösen, wobei die Performance bei größeren Dateien wahrscheinlich nicht so toll sein wird.


----------



## Stefanru (11. Mai 2006)

Danke erstmal, das hört sich gut an. 
Leider hab ich bisher nur erfahrung mit Xpath, werd mich mal in JDOM einlesen.
Die Struktur des XML kann schon komplizierter werden. Also auch mit attributen und so. Denke aber erstmal würde mir so etwas wie du es beschreibst reichen. Blöd dass es da noch nix fertiges gibt. 
Wie gesagt werd mich mal einlesen....

Gruß
Stefan


----------



## Stefanru (11. Mai 2006)

So hab mir das mal etwas angeschaut, irgendwie alles nicht so einfach.
Kannst du mir ein Beispiel geben wie das ungefähr gehen soll?
Also ich will einfach das XML Parsen und alle Key | Values auslesen. Irgendwie blick ich nicht so ganz wie ich das mit JDOM anstellen soll.
Vieleicht fehlt mir auch nur der Anfang.

Ein weiteres Problem, das sich aber sicher irgendwie beheben lässt ist das die ganze konvertiererrei in einer Oracle Datenbank stattfindet dort aber als Java. Ich denke JDOM steht da (noch) nicht zur verfügung, wird sich aber hoffentlich einbinden lassen. Zum erstellen des XML documents verwende ich folgende Libarys:

import javax.xml.parsers.DocumentBuilderFactory;

import oracle.sql.CLOB;
import oracle.xml.parser.v2.NodeFactory;
import oracle.xml.parser.v2.XMLDocument;
import oracle.xml.parser.v2.XMLElement;
import oracle.xml.parser.v2.XMLNode;
import oracle.xml.parser.v2.XMLText;
import oracle.xml.parser.v2.XSLException;

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

Gruß
Stefan


----------



## Stefanru (12. Mai 2006)

Hi, ok ich habs jetzt anders gemacht,
wegen zeitmangel usw, wandle ich nun das XML in einen String und zerlege es in Teile. Dann misbrauche den Key / Value als Container für mein zerstückeltes XML.
Dieses landet in System 1. Dort bau ich es mir wieder zusammen.

Nun will ich es wieder zurückparsen in ein XML Document um dann in System 1 das genau weiß welche werte es aus dem XML haben will mir diese per XPath zu besorgen. Leider klappt dass mim zurückwandeln in XML nicht.
Ich habe keine ahnung warum. 
Das ist mein Code dazu:

theXMLString ist mein zusammengesetztes XML.


```
Document theCorXml = null;
    try {
      DocumentBuilder db1= DocumentBuilderFactory.newInstance().newDocumentBuilder();
      theCorXml = db1.parse(new InputSource(new StringReader(theXMLString)));
    } catch (ParserConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (FactoryConfigurationError e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SAXException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
```

Wenn ich debuge steht danach in theCorXml [#document: null]. Das versteh ich irgendwie überhaupt nicht....

Gruß
Stefan


----------



## Stefanru (12. Mai 2006)

Ok, das null ist wohl normal. Ich hab das XML nun als Document.

Hab nun noch ne andere Frage aber die führt hier zu weit ich öfne ein neues Topic.

Danke erstmal.

Gruß
Stefan


----------

