48 Stimmen

Extraktion von Daten aus einer einfachen XML-Datei

Ich habe eine XML-Datei mit dem Inhalt:

<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>

Ich brauche einen Weg, um zu extrahieren, was sich in der <job..> </job> Tags, in diesem Fall programmin. Dies sollte in der Linux-Eingabeaufforderung mit grep/sed/awk geschehen.

0 Stimmen

Wenn Ihre XML-Datei dies enthalten würde: <?xml version="1.0" encoding="utf-8"?> <job xmlns=" sample.com/">Tom & Jerry</job> würden Sie wollen, dass das Ergebnis XML-Escaping in Ruhe gelassen wird: Tom & Jerry oder möchten Sie, dass das Escaping rückgängig gemacht wird, wie es ein XML-Parser tun würde: Tom & Jerry Wenn letzteres der Fall ist, weiß ich leider nicht, wie man das mit Unix-Textprogrammen macht.

0 Stimmen

@Paul s/&amp;/\&/g , auch für &quot; usw., natürlich wird es nicht für benutzerdefinierte Entitäten usw. verallgemeinert.

0 Stimmen

6voto

vldbnc Punkte 389

Verwendung von sed Befehl:

Exemple :

$ cat file.xml
<note>
        <to>Tove</to>
                <from>Jani</from>
                <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
</note>

$ cat file.xml | sed -ne '/<heading>/s#\s*<[^>]*>\s*##gp'
Reminder

Erläuterung:

cat file.xml | sed -ne '/<pattern_to_find>/s#\s*<[^>]*>\s*##gp'

n - Drucken aller Zeilen unterdrücken
e - Skript

/<pattern_to_find>/ - findet Zeilen, die ein bestimmtes Muster enthalten, was z.B. sein könnte. <heading>

der nächste Teil ist die Substitution s///p die alles außer dem gewünschten Wert entfernt, wobei / wird ersetzt durch # für eine bessere Lesbarkeit:

s#\s*<[^>]*>\s*##gp
\s* - enthält Leerzeichen, falls vorhanden (auch am Ende)
<[^>]*> steht für <xml_tag> als nicht-gierige Regex-Alternative verursachen <.*?> funktioniert nicht für sed
g - ersetzt alles, z.B. das Schließen von xml </xml_tag> Tag

5voto

13ren Punkte 11339

Angenommen, dieselbe Zeile, Eingabe von stdin:

sed -ne '/<\/job>/ { s/<[^>]*>\(.*\)<\/job>/\1/; p }'

Anmerkungen: -n verhindert, dass alles automatisch ausgegeben wird; -e bedeutet, dass es sich um einen Einzeiler handelt (und nicht um ein Skript) /<\/job> verhält sich wie ein grep; s entfernt den Opentag + Attribute und den Endtag; ; ist eine neue Anweisung; p Drucke; {} bewirkt, dass grep auf beide Anweisungen als eine einzige angewendet wird.

0voto

codaddict Punkte 426877

Wie wäre es damit:

cat a.xml | grep '<job' | cut -d '>' -f 2 | cut -d '<' -f 1

4 Stimmen

UUOC. grep '<job' a.xml | ...

0 Stimmen

@Geist aber aber aber, ich denke, es ist sauberer / schöner / nicht so sehr eine Verschwendung / mein Vorrecht, Prozesse zu verschwenden! partmaps.org/era/unix/award.html#cat (Ich denke, es ist einfacher, den Dateinamen zu bearbeiten, da er näher am Anfang liegt)

3 Stimmen

Wenn Sie < a.xml | grep ... erhalten Sie es noch näher am Start.

0voto

miku Punkte 170688

Ich bin etwas zu spät gekommen.

xmlcutty schneidet Knoten aus XML aus:

$ cat file.xml
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
<job xmlns="http://www.sample.com/">designing</job>
<job xmlns="http://www.sample.com/">managing</job>
<job xmlns="http://www.sample.com/">teaching</job>

El path gibt den Pfad zu dem Element an, das Sie ausschneiden möchten. Da wir in diesem Fall überhaupt nicht an den Tags interessiert sind, benennen wir das Tag um in \n so dass wir eine schöne Liste erhalten:

$ xmlcutty -path /job -rename '\n' file.xml
programming
designing
managing
teaching

Beachten Sie, dass das XML zu Beginn nicht gültig war (kein Root-Element). xmlcutty kann auch mit leicht beschädigtem XML arbeiten.

0voto

m.nguyencntt Punkte 750

Ihrexmldatei.xml

<item> 
  <title>15:54:57 - George:</title>
  <description>Diane DeConn? You saw Diane DeConn!</description> 
</item> 
<item> 
  <title>15:55:17 - Jerry:</title> 
  <description>Something huh?</description>
</item>

grep 'Titel' yourxmlfile.xml

  <title>15:54:57 - George:</title>
  <title>15:55:17 - Jerry:</title>

grep 'Titel' yourxmlfile.xml | awk -F">" '{print $2}'

  15:54:57 - George:</title
  15:55:17 - Jerry:</title

grep 'title' yourxmlfile.xml | awk -F">" '{print $2}' | awk -F"<" '{print $1}'

  15:54:57 - George:
  15:55:17 - Jerry:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X