xmlstarlet 总是计数 0

xmlstarlet always count 0

为了实现一个脚本导入到我的数据库中,我想统计xml文件中节点的迭代次数。 我尝试使用 xmlstarlet,但每次他返回 0 作为答案...

这是我的 XML 文件的示例:

<?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>

在我的 bash 中,我这样做了 :

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

每次,结果都是 returns 0...我尝试了不同的 XPath,例如“//global/place”或“/place”,但结果是一样的...

有没有人知道如何解决它? 我正在使用 Ubuntu 服务器 14.04LTS。

@O.R.Mapper 是正确的:使用 xmlstarlet:

时必须指定名称空间
 xmlstarlet sel -N q="http://www.xxxxxxxxxxx" -t -v 'count(//q:place)' "$FILE"
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                ^^

对我有用(returns 2,前提是我将 </global> 添加到您提供的测试样本的末尾)。

q 是您将用来引用命名空间的名称,http...x 是 XML 文件中的 xmlns 值。然后每个标签名前面都加了q:来指定命名空间。除了 q,您还可以使用您想要引用命名空间的任何 ID — URL 定义了命名空间,而不是引用。

来自 the docs.