'xml Parser' in bash

janis

janis

BOFH
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
 
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?
 
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
 
Perl bietet schöne Möglichkeiten, XML zu parsen. Und nicht nur mit grep zu durchsuchen. ;)
 
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
 
wenn du das Beispiel in einer Variablen speicherst, hast du doch die Liste ... oder?
 
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' ' '`
 
Zuletzt bearbeitet:

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

verzeichniss suche funktioniert nicht

Gnome Classic Desktop: Home-Inhalt Icons ausblenden

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

NagiosGrapher 1.7.1 funktioniert nicht

Zurück
Oben