2016-03-20 1 views
1

extrahieren Ich möchte Plist XML-Dateien über xmlstartlet abfragen. Ich bin auf der Suche nach dem Text eines string Tag gerade nach ein einzigartiges key Tag. Die XML-Datei kann wie folgt aussehenIn Plist Dateien, wie Zeichenfolge Text nach eindeutigen Schlüssel-Tag über Xmlstarlet Tool

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>BuildMachineOSBuild</key> 
    <string>15B42</string> 
    <key>CFBundleDevelopmentRegion</key> 
    <string>en</string> 
    <key>CFBundleIconFile</key> 
    <string>AppIcon</string> 
    . 
    . 
    . 
</dict> 
</plist> 

oder

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<othertag> 
    <dict> 
     <key>BuildMachineOSBuild</key> 
     <string>15B42</string> 
     <key>CFBundleDevelopmentRegion</key> 
     <string>en</string> 
     <key>CFBundleIconFile</key> 
     <string>AppIcon</string> 
     . 
     . 
     . 
    </dict> 
</othertag> 
</plist> 

Auf jeden Fall, dass ich einen Weg nach zum Beispiel den String-Wert suchen der Schlüssel CFBundleDevelopmentRegion (in diesem Fall en).

So ist die Stelle in der Hierarchie, wo das Diktat auftritt, unbekannt (es kann /plist/dict oder /plist/another/dict oder woanders sein), aber der Schlusstext ist einzigartig in der ganzen Datei.

Ich habe

versucht
xmlstarlet sel -t -v '//string/following::key[text()="CFBundleDevelopmentRegion"]' myfile.plist 

aber ich bekomme keine Ausgabe. Ist mein XPath falsch oder muss ich andere Parameter für xmlstarlet angeben?

Antwort

2

können Sie auf diese Weise versuchen:

//key[.='CFBundleDevelopmentRegion']/following-sibling::string[1] 

Die XPath key Element finden, überall im XML-Dokument, in dem der Inhalt "CFBundleDevelopmentRegion" gleich, und er dann wieder nächsten folgende Geschwister string Element.

So ist die vollständige Befehlszeilen mit xmlstarlet sieht wie folgt aus:

xmlstarlet sel --net -t -v '//key[.="CFBundleShortVersionString"]/following-sibling::string[1]' myfile.plist 
+1

Diese Arbeit perfekt! – halloleo

Verwandte Themen