xmlstarlet始终计为0

时间:2017-01-18 13:54:13

标签: xml bash xpath xmlstarlet

为了实现导入我的数据库的脚本,我想计算一个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

每次都返回0结果......我尝试过不同的XPath,比如“// global / place”或“/ place”但结果是一样的......

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

1 个答案:

答案 0 :(得分:1)

@ O.R.Mapper是正确的:您必须在使用xmlstarlet时指定命名空间:

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

适用于我(如果我将</global>添加到您提供的测试样本的末尾,则返回2)。

q是您将用于引用命名空间的名称,http...x是XML文件中的xmlns值。然后,每个标记名称都在其前面添加q:以指定名称空间。而不是q,您可以使用您想要引用命名空间的任何ID - URL是定义命名空间的,而不是引用。

来自the docs