2015-01-27 2 views
0

У меня есть XML-файл, который выглядит следующим образом:извлечение данных из XML в зависимости от содержания конкретного тега

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:policies xmlns:ns1="http://www.companyname.nl/exchange/policyimport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <policy> 
     <serialnumber>159</serialnumber> 
     <relationnumber>159</relationnumber> 
     <policynumber>2013000001</policynumber> 
     <soort>2002</soort> 
     <policyStatus>1</policyStatus> 
     <startdate>2001-03-16</startdate> 
     <enddate>2016-03-16</enddate> 
     <label1>0</label1> 
     <label2>100</label2> 
     <btw>true</btw> 
    </policy> 
    <policy> 
     <serialnumber>159</serialnumber> 
     <relationnumber>159</relationnumber> 
     <policynumber>2013000002</policynumber> 
     <soort>2003</soort> 
     <policyStatus>1</policyStatus> 
     <startdate>2001-03-16</startdate> 
     <enddate>2016-03-16</enddate> 
     <label1>0</label1> 
     <label2>100</label2> 
     <btw>false</btw> 
    </policy> 
</ns1:policies> 

Я хотел бы, чтобы извлечь данные из тега с Баш скрипт, но в зависимости от содержания другого тега. Так, например: Если содержимое <btw> истинно, тогда получите содержимое <policynumber> в том же блоке (в данном случае 2013000001).

Если содержимое <soort> равно 2003 году, тогда получите содержимое <policynumber> в том же блоке (в данном случае 2013000002).

Возможно ли это в сценарии bash? Я попытался понять это с помощью xmlstarlet, но я новичок и не могу сделать это. TIA!

ответ

0

xmllint с его xpath builtin. проверьте, доступно ли это в текущем бинарном файле xmllint. в противном случае вам нужно перекомпилировать xmllint.

xmllint --help | grep "\-\-xpath"

, если он доступен, то вы можете использовать:

xmllint --xpath "//policy/btw[text()='true']/../policynumber" xmllint-xpath.file

шаги команды вниз все направления политики //policy проверяя текстовое значение КТЦ btw[text()='true'] и если это правда, что собирает BTW-х братьев и сестер по имя перемещение вверх .. первый.

0

Это XMLStarlet команда возвращает все <policynumber> значения, разделенные пробелами, которые находятся в пределах <policy> с с <btw> значений равно «истина»:

xml sel -t -m "//policy/btw[. = 'true']/../policynumber" -v "." -o " " in.xml 
+0

выглядит, если есть префикс пространства имен, указанное делает похоже, не работает. – Rao

+0

Здесь не требуется префикс пространства имен. Он был протестирован с помощью XML OP, и он работает по мере необходимости. – kjhughes

+0

Я имел в виду, что если для каждого элемента в xml есть префикс пространства имен, для xpath также потребуется тот же префикс. Конечно, команда, предоставленная вами, работает для данного xml в исходном сообщении. – Rao

Смежные вопросы