Announcement

Collapse
No announcement yet.

Mehrere XML-Dateien zusammenhängen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrere XML-Dateien zusammenhängen

    Hallo zusammen!

    Ich habe immer wieder viele verschiedene XML-Dateien, die mit den gleichen Elementen aufgebaut sind, z.B.:
    <titel>, <vorspann>, <inhaltsverzeichnis>, <textblock> und <liste> innerhalb von <root>.

    Aus den vielen verschiedenen Dateien (oft mehrere hundert), möchte ich eine einzige Datei machen.
    Wenn ich mit
    Code:
    copy *.* gesamt.xml
    alle Dateien zusammenkopiere, habe ich zwar eine einzige Datei, muss aber mit einem Texteditor alle XML-Versionszeilen (<?xml version=...>), DOCType-Zeilen, <titel>, <vorspann> und <inhaltsverzeichnis> entfernen.
    Nur ganz zu Beginn, also bei der ursprünglich ersten Datei sollen XML-Deklaration, die DOCType-Zeile, <titel>, <vorspann> und <inhaltsverzeichnis> stehen bleiben.
    Das Wurzelement <root> darf natürlich auch nur einmal in der Gesamtdatei vorhanden sein.

    Von der Struktur gibt das kein Problem und würde innerhalb von <root> so aussehen:
    <titel>, <vorspann>, <inhaltsverzeichnis>, <textblock> und <liste> (aus Datei 1), <textblock> und <liste> (aus Datei 2), <textblock> und <liste> (aus Datei 3) usw.

    Leider habe ich bisher keinen Weg gefunden, so ein Ergebnis zu erzielen. Ich verwende XMLSpy.

    Kann mir jemand weiterhelfen? Danke!

    Gruß, Peter

  • #2
    Hallo,

    du kannst z.B. mit Regex vorher nur die relevanten XML-Zeilen selektieren und diese dann in die neue Datei kopieren.

    Per Programmierung wäre das auch möglich, ist für diese Aufgabe aber wohl overkill.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Um deb Ausdruck zu entwerfen:

      http://www.regexplanet.com/advanced/java/index.html




      Mit Texteditoren wie Textpad kann man sich ein Macro aufzeichnen, welches ggf. die Löschung der Zeilen übernimmt
      Christian

      Comment


      • #4
        Danke für die Antworten. Ja, stimmt schon - mit Regex kann man da auch einiges machen. Ich muss es nur so dokumentieren, dass es auch Benutzer, die nicht mit Regex vertraut sind, umsetzen können.

        Gruß, Peter

        Comment


        • #5
          Warum dann nicht ein Programm dafür....Die Zeit die es kostet legst du sonst bei der Doku des Ausdruckes und den Support der Anwender drauf
          Zuletzt editiert von Christian Marquardt; 10.09.2013, 07:54.
          Christian

          Comment


          • #6
            XML Spy hatte einen XSLT 2.0 Prozessor namens AltovaXML, den man auch getrennt benutzen konnte. Doku ist unter http://manual.altova.com/altovaxml/a...onssupport.htm.

            Damit sollte folgendes funktionieren:

            Code:
            <xsl:variable name="dir" select="'file:///C:/dirname'"/>
            
            <xsl:variable name="files" select="collection(concat($dir, '/*.xml'))"/>
            
            <xsl:template name="main">
              <xsl:apply-templates select="$files[1]"/>
            </xsl:template>
            
            <xsl:template match="@* | node()">
              <xsl:copy>
                 <xsl:apply-templates select="@* , node()"/>
              </xsl:copy>
            </xsl:template>
            
            <xsl:template match="/*">
              <xsl:copy>
                <xsl:apply-templates select="titel, vorspann, inhaltsverzeichnis, $files/*/(* except (title, vorspann, inhaltsverzeichnis))"/>
              </xsl:copy>
            </xsl:template>
            Du musst dann sicherstellen, dass der Prozessor mit dem Template namens "main" startet (z.b. altovaxml.exe /n main) und dass der Parameter mit dem Verzeichnis richtig gesetzt ist.

            Das einzige Problem ist, dass das XSLT-Datenmodell keinen DOCTYPE-Knoten kennt und man den dann nicht einfach per Code aus einem Dokument kopieren kann.

            Du musst also im XSLT per

            Code:
            <xsl:output method="xml" doctype-public="..." doctype-system="..."/>
            die gewünschten Werte ausgeben lassen.

            Comment


            • #7
              Ich bin nicht früher dazugekommen, das XSLT auszuprobieren, da andere Projekte Vorrang hatten.

              Jetzt habe ich es aber getestet. Funktioniert wunderbar - danke - nur die Attribute vom Wurzelelement gehen verloren.
              Die Doctype-Zeile ist kein Problem, da diese immer gleich lautet.

              Gruß, Peter

              Comment


              • #8
                Wenn das Wurzelelement auch Attribute hat und diese kopiert werden sollen, dann ändere
                Code:
                <xsl:template match="/*">
                  <xsl:copy>
                    <xsl:apply-templates select="titel, vorspann, inhaltsverzeichnis, $files/*/(* except (title, vorspann, inhaltsverzeichnis))"/>
                  </xsl:copy>
                </xsl:template>
                in
                Code:
                <xsl:template match="/*">
                  <xsl:copy>
                    <xsl:apply-templates select="@*, titel, vorspann, inhaltsverzeichnis, $files/*/(* except (title, vorspann, inhaltsverzeichnis))"/>
                  </xsl:copy>
                </xsl:template>

                Comment


                • #9
                  Vielen Dank!

                  Comment

                  Working...
                  X