'xml Parser' in bash

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von janis, 27.11.2010.

  1. janis

    janis BOFH

    Dabei seit:
    02.09.2007
    Beiträge:
    179
    Zustimmungen:
    0
    Ort:
    Deutschland
    Hallo,

    nach langer Inaktivität hab ich mal wieder ein Problem.
    Ich habe eine XML-Datei die eventuell eine Liste mit Dateien enthält, die in ein tar-Archiv gepackt werden sollen.

    Hier mal die XML-Datei:
    Code:
    <?xml version="1.0"?>
    <!DOCTYPE addon SYSTEM "http://path-to-dtd/addon.dtd">
    <addon>
      <name>test</name>
      <version>2</version>
      <caption>Test</caption>
      <description>This is a tesplugin</description>
      <author>Jan H</author>
      <homepage>http://test.de</homepage>
      <options>
        <option var="10">menu</option>
        <option var="123456789">pgp</option>
      </options>
      <dependencies>
      </dependencies>
      <preinstall>
        <sql type="file">file1.sql</sql>
        <sql type="file">datei2.sql</sql>
        <sql type="command">CREATE TABLE `test` (`a` INT NOT NULL) ENGINE = MYISAM ;</sql>
      </preinstall>
      
      <postinstall></postinstall>
    </addon>
    Folgendes bash Script habe ich bis jetzt:
    Code:
    #! /bin/bash
    
    function cleanup()
    {
      unlink md5sums.gpg>/dev/null 2>&1
      unlink md5sums>/dev/null 2>&1
      unlink data.tgz>/dev/null 2>&1
    }
    
    #Cleanup
    trap cleanup EXIT SIGHUP SIGINT SIGQUIT SIGTERM
    
    #Get Package Name
    while IFS='<>' read _ starttag value endtag; do
        case "$starttag" in 
            name) name+=("$value") ;;
        esac
    done < info.xml
    echo $name
    
    cleanup
    unlink "$name.tar.gz">/dev/null 2>&1
    
    #Zip Files
    tar cfvz "data.tgz" "$name"
    
    #Calculate MD5
    md5sum "data.tgz" "info.xml">md5sums;
    
    #Sign MD5sums
    gpg --yes -s md5sums;
    
    #Zip Package
    if [ -f "md5sums.gpg" ];
    then
      tar cfvz "$name.tar.gz" "data.tgz" "md5sums.gpg" "info.xml"
    fi
    
    
    Die aus der XML ausgelesenen Dateien müssten dann mit md5sum verarbeitet werden und dann in der vorletzten Zeile zu dem tgz Archiv hinzufügt werden.
    Wie gehe ich das am besten an?
    Kann ich in meiner while Schleife die Parameter überprüfen?
    Weil dann könnte ich mir eine Dateiliste anlegen.
    Aber nicht jedes <sql> Tag muss einen Dateinamen enthalten und es kann auch vorkommen, dass gar keine Dateien angegeben werden.

    Ich hoffe ihr könnt mir helfen
    MfG
    Janis
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. janis

    janis BOFH

    Dabei seit:
    02.09.2007
    Beiträge:
    179
    Zustimmungen:
    0
    Ort:
    Deutschland
    Das Unixboard das ich kannte, war aktiver :(

    Kann mir hier keiner helfen?
    Muss ja nicht direkt ein XML Parser sein.
    Reguläre Ausdrücke sollten doch auch schon reichen. Kennt sich da wer aus?
     
  4. zst

    zst Foren As

    Dabei seit:
    06.09.2006
    Beiträge:
    95
    Zustimmungen:
    0
    Hallo janis,
    das Problem der Inaktivität ist vielleicht die nicht ganz klare Formulierung: was möchtest du genau, außer ALLES?
    Wenn du aus der XML-Datei NUR die Dateinamen extrahieren willst und diese immer nach type="file" kommen, dann sollte das auch mit grep gehen.
    Code:
    grep "type=\"file" DEINE-XML-DATEI.xml | grep -o ">.*<" | tr -d ">" | tr -d "<"
    
    Mein Ergebnis:
    file1.sql
    datei2.sql

    Kann man gewiss schöner, einfacher, besser machen ... vielleicht aber trotzdem ein Ansatz für dich.
    Gruß zst
     
  5. sinn3r

    sinn3r Law & Order
    Moderator

    Dabei seit:
    28.12.2006
    Beiträge:
    2.764
    Zustimmungen:
    0
    Ort:
    Wentorf
    Perl bietet schöne Möglichkeiten, XML zu parsen. Und nicht nur mit grep zu durchsuchen. ;)
     
  6. janis

    janis BOFH

    Dabei seit:
    02.09.2007
    Beiträge:
    179
    Zustimmungen:
    0
    Ort:
    Deutschland
    Danke für die Antworten und @zst danke für die (konstruktive) Kritik

    Ziel ist es alle Dateinamen aus der Datei auszulesen, die in einem <sql> Tag mit dem type="file" stehen. Es könnten noch weitere Parameter zu sql hinzukommen z.B.
    Code:
    <sql type="file" priority="1">backup.sql</sql>
    Die Dateien möchte ich dann gerne in einem String haben:
    Code:
    '"datei1" "datei2" "datei3"'
    
    So dass ich ihn einfach als Parameter für tar anhängen kann.
    Grep werde ich mir noch mal genauer anschauen.
    
    @sinn3r:
    Kann ich mir Perl auch Programme interaktiv starten?
    Weil gpg verlangt ein Passwort.
    
    Gruß
    Jan
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. zst

    zst Foren As

    Dabei seit:
    06.09.2006
    Beiträge:
    95
    Zustimmungen:
    0
    wenn du das Beispiel in einer Variablen speicherst, hast du doch die Liste ... oder?
     
  9. #7 janis, 03.12.2010
    Zuletzt bearbeitet: 03.12.2010
    janis

    janis BOFH

    Dabei seit:
    02.09.2007
    Beiträge:
    179
    Zustimmungen:
    0
    Ort:
    Deutschland
    Danke.
    Grep hat geholfen:
    Code:
    grep -Eo "<sql[^>]*type=\"file\"[^>]*>(.*)</sql>" XML_FILE.xml | grep -o ">.*<" | tr '>' '"' | tr '<' '"' | tr '\n' ' '
    
    Wer es brauchen könnte ;)

    Edit://
    Wie bekomme ich den Return jetzt in eine Variable gespeichert?

    Edit2://
    Code:
    filelst=`grep -Eo "<sql[^>]*type=\"file\"[^>]*>(.*)</sql>" info.xml | grep -o ">.*<" | tr -d '>' | tr -d '<' | tr '\n' ' '`
     
Thema: 'xml Parser' in bash
Besucher kamen mit folgenden Suchen
  1. bash xml parsen

    ,
  2. bash xml auslesen