2016-09-06 3 views
0

Ich habe diese XMLWarum funktioniert meine XMLStarlet-Abfrage nicht, wenn sie Anführungszeichen enthält?

<Result> 
<Dataset name='ident1'> 
<Row name='a1'> 
    <queryname>cat0</queryname> 
    <superfilename>cat1</superfilename> 
    <indexfilename>cat2</indexfilename> 
</Row> 
<Row name='a2'> 
    <queryname>cat3</queryname> 
    <superfilename>cat4</superfilename> 
    <indexfilename>cat5</indexfilename> 
</Row> 
<Row name='a3'> 
    <queryname>cat6</queryname> 
    <superfilename>cat7</superfilename> 
    <indexfilename>cat8</indexfilename> 
</Row> 
</Dataset> 
<Dataset name='Result 2'> 
</Dataset> 
<Dataset name='Result 3'> 
</Dataset> 
<Dataset name='Result 4'> 
</Dataset> 
</Result> 

ich die Anzahl der Zeilen von Dataset mit dem Namen Ident1 zählen möchten. Der xmlstarlet Befehl Ich verwende ist:

xmlstarlet sel -t -v 'count(/Result/Dataset[@name='ident1']/Row)' oscar.xml 

ich denke, es sollte funktionieren, aber es ist 0. Rückkehr

Ich habe andere Variationen ausprobiert, aber alle von ihnen zurückkehren 0.

xmlstarlet sel -t -v 'count(/Result/Dataset[@name='ident1'])' oscar.xml 
xmlstarlet sel -t -v 'count(/Result/Dataset[@name='ident1'][*]/Row)' oscar.xml 
xmlstarlet sel -t -v 'count(/Result/Dataset[@name='ident1']/Row[*])' oscar.xml 

Was mache ich falsch?

HINWEIS

Wenn ich ein anderes Element wie DataSet zählen gibt es richtig 4.

xmlstarlet sel -t -v 'count(/Result/Dataset)' oscar.xml 
+0

Sie verwenden die gleichen Anführungszeichen wie die Shell-Syntax und die xmlstarlet-Syntax. –

+0

... übrigens, StackOverflow Syntax Highlighting (obwohl oft falsch für die Shell) ist eigentlich etwas, was Sie möglicherweise als einen nützlichen Hinweis in diesem Fall genommen haben. –

+0

Ich verwende Notepad ++ als Editor mit "Batch" -Syntax. Ich sollte "Bash" -Syntax hinzufügen, um dies zu vermeiden ... –

Antwort

2

Hierbei sind die Zitate sind alle Shell-Syntax; in Folge, streift die Shell die Anführungszeichen, bevor die Abfrage xmlstarlet gegeben:

# bad: looks for @name=ident1, no quotes 
# literal query is: count(/Result/Dataset[@name=ident1]/Row) 
# ...which compares @name against the value of an element under Dataset named ident1 
# ...since no such element exists, the result is a count of 0. 
xmlstarlet sel -t -v 'count(/Result/Dataset[@name='ident1']/Row)' oscar.xml 

Stattdessen machen es:

# good: uses ""s on the outside, so ''s on the inside are literal 
# literal query is: count(/Result/Dataset[@name='ident1']/Row) 
xmlstarlet sel -t -v "count(/Result/Dataset[@name='ident1']/Row)" oscar.xml 

... oder, wenn die Shell bash ist:

# good (but nonportable): uses $'' syntax, which makes \' produce a single literal ' 
# literal query is: count(/Result/Dataset[@name='ident1']/Row) 
xmlstarlet sel -t -v $'count(/Result/Dataset[@name=\'ident1\']/Row)' oscar.xml 

Alles oben genannte passiert, weil Anführungszeichen in der Shell ein charakteristisches Merkmal sind. Sie können zum Beispiel schreiben:

echo "$foo"'$bar'$baz 

... und $foo wird pro doppelte Anführungszeichen Regeln (wörtlichen Ersatz mit Kommentaren) erweitert werden, wird $bar als Zeichenkette behandelt werden, und $baz wird pro erweitert werden Unquoted-Expansion-Regeln (mit String-Splitting und Globbing, die oft unerwünschtes Verhalten zur Folge haben).

+0

Ich benutze bash. Ich wusste nichts über Zitate. Als ich eine 0 sah, dachte ich, dass Syntax richtig war. Danke :-) –

+0

Eine Sache, die Sie tun können, um zu sehen, wie die Shell Ihre Syntax interpretiert, ist 'set -x', die jeden Befehl an stderr vor dem Ausführen ausgibt. Aber, ja, das Ergebnis ist eine gültige XPath-Abfrage, es ist einfach nicht eine, die das tut, was Sie wollen. –

Verwandte Themen