2017-01-18 7 views
1

Чтобы реализовать скрипт для импорта в мой db, я хотел бы подсчитать количество итераций узла в XML-файле. Я пытался использовать XMLStarlet, но каждый раз, когда он возвращается 0, как ответ ...xmlstarlet всегда count 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> 

В моем Баше, я сделал это:

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

Каждый раз, она возвращает 0 в результате ... Я пробовал различные XPaths как «// глобальный/место» или «/» место, но результат тот же ...

Кто-нибудь имеет представление о как его решить? Я использую сервер Ubuntu 14.04LTS.

+1

Я думаю, что вы забыли перевести свой XPath, поэтому он говорит 'place' вместо' lieu' (?) –

+1

Несмотря на это, возможно, вам нужно указать некоторое сопоставление пространства имен для xmlstarlet? –

+0

Вы правы ... Я не переводил свою презентацию ... Я сделал исправление. Но этой ошибки не было в моем коде – Yvo

ответ

1

@ O.R.Mapper правильно: Вы должны указать пространство имен при использовании xmlstarlet:

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

работает для меня (возвращает 2, при условии, добавить </global> к концу тестового образца вы предоставили).

q - это имя, которое вы будете использовать для ссылки на пространство имен, а значение http...x - это значение xmlns из вашего XML-файла. Затем каждое имя тега имеет q:, добавленное к нему, чтобы указать пространство имен. Вместо q вы можете использовать любой идентификатор, который хотите сослаться на пространство имен —. URL-адрес определяет пространство имен, а не ссылку.

От the docs.

+0

Чрезвычайно много для вас обоих! – Yvo

+0

Лучшая ссылка на doc - http://xmlstar.sourceforge.net/doc/UG/ch05.html, в которой объясняется, что '_: place' должно работать без необходимости определять определения в командной строке. – npostavs