根据特定标记的内容从XML中提取数据

时间:2015-01-27 13:41:25

标签: xml bash

我有一个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>

我想使用bash脚本从标记中提取数据,但取决于另一个标记的内容。 例如: 如果<btw>的内容为true,则在同一个块中获取<policynumber>的内容(在本例中为2013000001)。

如果<soort>的内容是2003,那么在同一个区块中获取<policynumber>的内容(在本例中为2013000002)。

这是否可以在bash脚本中使用?我试图用xmlstarlet解决它,但我是一个新手,无法完成它。 TIA!

2 个答案:

答案 0 :(得分:0)

xmllint xpath内置一起使用。检查它是否在您当前的xmllint二进制文件中可用。否则你需要重新编译xmllint。

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

如果可用,您可以使用:

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

该命令会逐步调低所有策略//policy检查btw btw[text()='true']的文本值,如果这是真的,它会先收集btw的兄弟姐妹名称..

答案 1 :(得分:0)

xmlstarlet 命令将返回所有<policynumber>值,以空格分隔,这些值位于<policy> s内且<btw>值等于'true':< / p>

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