Andreas Riedel: XML Dateien importieren andere XML Dateien

Hallo Forum.

Ich hatte eigentlich gehofft, die Lösung schnell zu finden, jetzt Suche ich aber schon seit 1/2 Tag rum. Deshalb jetzt lieber die Frage in Forum, in der Hoffnung auf Hilfe.

Folgendes Problem:

  • Ich habe mit Hilfe von Java und Ant einen XML/XSLT Code Generator geschrieben. Der Java Code verbindet sich zu einer Datenbank, ließt die Meta-Daten einer Tabelle aus und generiert eine XML mit deren Hilfe ich die DTO mit ihren Getter/Setter erstellen kann. Diese XML Datei läßt sich also einfach generieren. Für den Datenzugriff benötige ich jetzt zusätzliche Daten in der XML Datei, die nicht generiert werden können. Bei ersten Versuch habe ich die XML Datei um die zusätzlichen Attribute ergänzt. Lief toll. Nur leider wurde beim nächsten Generieren alles übergebügelt. Javaseitig könnte man das Problem umgehen, wenn man vor dem Schreiben die XML Datei ausließt und die manuellen Änderungen in die neue Datei übernimmt. Hatte aber eigentlich auf eine einfacher Lösung gehofft, indem ich einfach eine zusätzliche XML Datei importiere. So etwas muß doch möglich sein. Hier noch ein bischen XML fürs bessere Verständnis:

<?xml version="1.0" encoding="UTF-8"?>

<root>
  <tableName name="ORGU_PRGP_LINK" />
  <className name="Opgl" />
  <packageName name="de.jdi.jdbc.directaccess" />
  <since value="18.12.2003 16:02" />
  <columns>
    <column attributeName="orguId" columnName="ORGU_ID" methodName="OrguId" type="PrimaryKey" />
    <column attributeName="prgpId" columnName="PRGP_ID" methodName="PrgpId" type="PrimaryKey" />
    ...
  </columns>

<!-- Nicht generierter Teil. Start -->
  <insert>
    <stmt>INSERT INTO ORGU_PRGP_LINK(</stmt>
    <stmt>PRGP_ID, </stmt>
    <stmt>ORGU_ID, </stmt>
    <stmt>OGPL_PRICE_UPD_CTL, </stmt>
    <stmt>LCOUNT</stmt>
    <stmt>)VALUES(?,?,?,?)</stmt>
  </insert>
  <!-- Nicht generierter Teil. Ende -->
</root>

Meine Hoffnung ist, den unteren Teil in eine andere Datei auszugliedern, nach dem Motto:

<?xml version="1.0" encoding="UTF-8"?>

<root>
  <tableName name="ORGU_PRGP_LINK" />
  <className name="Opgl" />
  <packageName name="de.jdi.jdbc.directaccess" />
  <since value="18.12.2003 16:02" />
  <columns>
    <column attributeName="orguId" columnName="ORGU_ID" methodName="OrguId" type="PrimaryKey" />
    <column attributeName="prgpId" columnName="PRGP_ID" methodName="PrgpId" type="PrimaryKey" />
    ...
  </columns>

<!-- Nicht generierter Teil. Start -->
  <import href="XYZAddOns.xsl"/>
  <!-- Nicht generierter Teil. Ende -->

</root>

Wobei XYZAddOns.xml =
  <insert>
    <stmt>INSERT INTO ORGU_PRGP_LINK(</stmt>
    <stmt>PRGP_ID, </stmt>
    <stmt>ORGU_ID, </stmt>
    <stmt>OGPL_PRICE_UPD_CTL, </stmt>
    <stmt>LCOUNT</stmt>
    <stmt>)VALUES(?,?,?,?)</stmt>
  </insert>

Hat irgendeiner einen Rat??

Danke

Andreas Riedel

  1. Hallo Andreas,

    Folgendes Problem:
    Für den Datenzugriff benötige ich jetzt zusätzliche Daten in der XML Datei, die nicht generiert werden können. Bei ersten Versuch habe ich die XML Datei um die zusätzlichen Attribute ergänzt. Lief toll. Nur leider wurde beim nächsten Generieren alles übergebügelt. Javaseitig könnte man das Problem umgehen, ...

    Javaseitig könntest du deine Klassen etc. erweitern in dem du eine "generations pipeline" erstellst. D.h. in einer Kontrolldatei (*.properties, oder was auch immer) definierts du was alles dein End-XML behalten soll, dann wird diese Datei ausgelesen und dein Programm holt die Teile und generiert daraus dein End-XML.

    XML-Seiteig könntest du es nur machen, wenn du deine zweite XML als externe Entity in einer DTD definierst und dann diese im (ersten) XML aufrufst. Dabei muss du allerdings einen XML-Parser haben, der die DTD lesen und die entities auflösen kann.

    XSL-Seitig (könnte das einfachste für dich sein)
    Du kannst aus deinem XSL-Sheet heraus durch die document() Funktion auf externe XML-Dateien zugreifen und dann diese in die Transformation einbeziehen.

    Grüße
    Thomas