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