Hilfe beim Mapping

Loki2

Erfahrenes Mitglied
Hallo

Ich brauche ein Mapping welches mir ein XML File in ein anderes umwandelt.
Also bestimmte TagNamen sollen umbenannt werden.
Mein Programm ließt also eine XML Datei ein und schreibt das Ergebnis mit den geänderten TagNamen in eine neue Datei die dann weiter verarbeitet wird. So soll es dann jedenfalls sein, ich stehe aber im Moment noch vor dem Problem das ich nicht wirklich den Plan davon habe wie ich so ein Mapping schreibe... Kann mir da vielleicht jemand den nötigen Hinweis geben. Das wäre super.

Vielen Dank!

Gruß und so
Loki2
 
OK, tut mir Leid wenn ich mein Problem zu allgemein gehalten habe.

Also nochmal:

Ich habe eine XML Datei die zum Beispiel folgenden Tag enthält:

<Test>Check the Editor</Test>

Aus diesem Tag soll dann dieser hier werden und in der neu erzeugten Datei stehen:

<Label>Check the Editor</Label>

Ich habe jetzt schon daran gedacht das ich mein Programm mit einer Art Beschreibungsdatei arbeiten lasse in der steht welcher Tag wie umbenannt wird um das ganze flexibel und leicht anpassbar zu machen. Eine Beschreibungsdatei könnte dann evtl. so aussehen:
Code:
 <changelist>
    <criteria_list>
      <criteria change="tagname" from="Test" to="Label"/>
      <criteria change="tagname" from="EM2006" to="WM2006"/>
      <criteria change="attribname" from="val" to="value"/>
    </criteria_list>
  </changelist>
Jetzt bin ich mir nicht sicher wie und womit ich die Dateien am besten einlese, bearbeite und die Zieldatei erzeuge... Also wie kann ich zum Beispiel Die Tags aus der Quelldatei mit der in der Beschreibungsdatei vergleichen?

Ich würde jetzt mit xmlbeans weitermachen und aus der Quelldatei und der Beschreibungsdatei ein XmlObject erzeugen und damit irgendwie weiterarbeiten. Wäre ich damit auf einem richtigen Weg? Gibt es womöglich eine ganz andere bessere Lösung?

Das Ziel ist es das aus der Quelldatei eine GUI erzeugt wird. Auf die Erstellung der Quelldatei habe ich keinen Einfluss und die ist immer nach dem gleichen Schema aufgebaut. Jetzt muss ich das ja so hinbekommen das ein XUL Framework die Datei versteht und mir dann eine GUI daraus erstellen kann. Dazu müssen die Tags aber ja speziell angepasst sein und das erhoffe ich so zu ermöglichen. Die Zieldatei die erzeugt wird soll dann an das XUL Framework übergeben werden so dass ich eine GUI bekomme und Values der Tags bearbeiten kann. Am Ende müssen die Änderungen dann natürlich auch wieder in die Quelldatei aber das ist erstmal eine andere Geschichte. Ich muss erstmal irgendwie die GUI hinbekommen.

Das ganze kennt man auch vielleicht aus Altova Authentic. Da wird anhand einer sps Datei auch eine XML Datei formatiert abgebildet.

Ich hoffe das ihr mir jetzt weiterhelfen könnt.

Vielen Dank!

Gruß und so
Loki2
 
Hallo!

Entweder baust du dir deinen eigenen XML Transformator der ein XML Dokument per SAX oder DOM Parser parst und anschliessend die dabei erkannt Struktur entsprechend umsetzt oder du bastelst dir ein XSL-Stylesheet zusammen und Tranformierst das Eingabe XML Format ober die im Stylesheet definierten Abbildungsregeln in ein Ausgabe XML Format.

Gruss Tom
 
Hallo!

Hier mal ein Beispiel für ein einfach XML 2 XML Mapping via XSLT mit Java:

In meinem Beispiel will ich das XML Dokument:
Code:
<?xml version="1.0"?>
<elements>
   <element groupId="A">A0</element>

   <element groupId="B">B0</element>

   <element groupId="C">C0</element>

   <element groupId="A">A1</element>

   <element groupId="A">A2</element>

   <element groupId="B">B1</element>

   <element groupId="B">B2</element>

   <element groupId="C">C1</element>
</elements>

In dieses transformieren:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<elements>
   <group id="A">
      <element>A0</element>

      <element>A1</element>

      <element>A2</element>
   </group>

   <group id="B">
      <element>B0</element>

      <element>B1</element>

      <element>B2</element>
   </group>

   <group id="C">
      <element>C0</element>

      <element>C1</element>
   </group>
</elements>

Dazu verwende ich dieses XSL Stylesheet:
Code:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" />

   <xsl:template match="/">
      <xsl:apply-templates />
   </xsl:template>

   <xsl:template match="elements">
      <elements>
         <xsl:for-each select="element[not(@groupId=preceding-sibling::element/@groupId)]">
            <xsl:call-template name="groupElementsByGroupID">
               <xsl:with-param name="groupId" select="@groupId" />
            </xsl:call-template>
         </xsl:for-each>
      </elements>
   </xsl:template>

   <xsl:template name="groupElementsByGroupID">
      <xsl:param name="groupId" />

      <group id="{$groupId}">
         <xsl:for-each select="//element[@groupId=$groupId]">
            <element><xsl:value-of select="."/></element>
         </xsl:for-each>
      </group>
   </xsl:template>
</xsl:stylesheet>

Code:
/**
 * 
 */
package de.tutorials;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/**
 * @author Tom
 * 
 */
public class XMLTransformationExample {
    /**
     * @param args
     */
    public static void main(String[] args) {
        String inputXML = "<?xml version=\"1.0\"?>\n" + "<elements>\n"
                + "    <element groupId=\"A\">A0</element>\n"
                + "    <element groupId=\"B\">B0</element>\n"
                + "    <element groupId=\"C\">C0</element>\n"
                + "    <element groupId=\"A\">A1</element>\n"
                + "    <element groupId=\"A\">A2</element>\n"
                + "    <element groupId=\"B\">B1</element>\n"
                + "    <element groupId=\"B\">B2</element>\n"
                + "    <element groupId=\"C\">C1</element>\n" + "</elements>";

        System.out.println("InputXML:");
        System.out.println(inputXML);

        String xslStylesheet = "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
                + "   <xsl:output method=\"xml\" />\n"
                + "<xsl:template match=\"/\">\n"
                + "<xsl:apply-templates />\n"
                + "</xsl:template>\n"
                + "\n"
                + "    <xsl:template match=\"elements\">\n"
                + "      <elements>\n"
                + "        <xsl:for-each select=\"element[not(@groupId=preceding-sibling::element/@groupId)]\">\n"
                + "           <xsl:call-template name=\"groupElementsByGroupID\">\n"
                + "              <xsl:with-param name=\"groupId\" select=\"@groupId\" />\n"
                + "           </xsl:call-template>\n"
                + "        </xsl:for-each>\n"
                + "     </elements>\n"
                + "  </xsl:template>\n"
                +

                "  <xsl:template name=\"groupElementsByGroupID\">\n"
                + "     <xsl:param name=\"groupId\" />\n"
                + "     <group id=\"{$groupId}\">\n"
                + "        <xsl:for-each select=\"//element[@groupId=$groupId]\">\n"
                + "           <element><xsl:value-of select=\".\"/></element>\n"
                + "        </xsl:for-each>\n"
                + "     </group>\n"
                + "  </xsl:template>\n" + "</xsl:stylesheet>";

        System.out.println("XSLStyleSheet:");
        System.out.println(xslStylesheet);

        try {
            StringWriter resultXML = new StringWriter();
            TransformerFactory.newInstance().newTransformer(
                    new StreamSource(new StringReader(xslStylesheet)))
                    .transform(new StreamSource(new StringReader(inputXML)),
                            new StreamResult(resultXML));

            System.out.println("Result XML:");
            System.out.println(resultXML);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Ausgabe:
Code:
Result XML:
<?xml version="1.0" encoding="UTF-8"?><elements><group id="A"><element>A0</element><element>A1</element><element>A2</element></group><group id="B"><element>B0</element><element>B1</element><element>B2</element></group><group id="C"><element>C0</element><element>C1</element></group></elements>

Die Erstellung von XSL Stylesheets ist zwar in der Regel etwas aufwendiger, dafür aber auch Portabel (man braucht ja nur einen XSLT Prozesor).
Eruß Tom
 
Hallo

Cool, vielen herzlichen Dank dafür :)
Damit kann ich erstmal arbeiten.

Schönen Tag und schönes Wochenende wünsche ich!

Gruß und so
Loki2
 
Zurück