2017-01-18 5 views
1

Um ein Skript in meine Datenbank zu importieren, möchte ich die Anzahl der Iterationen eines Knotens in einer XML-Datei zählen. Ich versuche xmlstarlet zu verwenden, aber jedes Mal, wenn er 0 als Antwort zurückkehrt ...xmlstarlet zählt immer 0

Hier ist ein Beispiel meiner XML-Datei:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<global xmlns="http://www.xxxxxxxxxxx"> 
    <place geoAccuracy="0" geoStatus="0" geoLatDeg="0.0" geoLongDeg="0.0" id="123"> 
     <name>XXXXXX</name> 
     <postalcode>12345</postalcode> 
     <city>city</city> 
     <country>country</country> 
    </place> 
    <place geoAccuracy="0" geoStatus="0" geoLatDeg="0.0" geoLongDeg="0.0" id="123"> 
     <name>XXXXXX</name> 
     <postalcode>12345</postalcode> 
     <city>city</city> 
     <country>country</country> 
    </place> 

In meinem bash, tat ich dies:

#!/bin/bash 
FILE="places.xml" RESULT=$(xmlstarlet sel -t -v "count(//place)" $FILE) 
echo $RESULT 

Jedes Mal, gibt sie 0 als Ergebnis ... ich habe wie andere XPaths versucht „// global/Ort“ oder „/ Platz“, aber das Ergebnis ist das gleiche ...

Hat jemand eine Idee? Wie löst man es? Ich benutze einen Ubuntu-Server 14.04LTS.

+1

Ich glaube, du hast vergessen, deinen XPath so zu übersetzen, dass er 'place' anstelle von' lieu' (?) Sagt. –

+1

Trotzdem musst du vielleicht ein Namensraum-Mapping für xmlstarlet angeben? –

+0

Sie haben Recht ... Ich habe in meiner Präsentation nicht übersetzt ... Ich habe die Korrektur gemacht. Aber dieser Fehler war nicht in meinem Code – Yvo

Antwort

1

@ O.R.Mapper ist richtig: Sie haben den Namespace angeben, wenn xmlstarlet mit:

xmlstarlet sel -N q="http://www.xxxxxxxxxxx" -t -v 'count(//q:place)' "$FILE" 
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^ 

Werke für mich (2 zurück, vorausgesetzt, ich hinzufügen </global> bis zum Ende der Testprobe Sie zur Verfügung gestellt).

Die q ist der Name, den Sie für den Namespace verwenden, und der http...x ist der xmlns Wert aus Ihrer XML-Datei. Dann hat jeder Tag-Name q: an der Vorderseite hinzugefügt, um den Namespace anzugeben. Anstelle von können Sie die ID verwenden, die auf den Namespace — verweisen soll. Die URL definiert den Namespace, nicht die Referenz.

Von the docs.

+0

Tks viel zu euch beiden läuft es perfekt! – Yvo

+0

Ein besserer Dokumentationslink ist http://xmlstar.sourceforge.net/doc/UG/ch05.html, der erklärt, dass '_: place' funktionieren sollte, ohne sich mit Definitionen in der Befehlszeile herumschlagen zu müssen. – npostavs