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

extract data from XML depending of contents of specific tag

我有一个 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> 的内容为真,则在同一块中获取 <policynumber> 的内容(在本例中为 2013000001)。

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

在 bash 脚本中可以吗?我试图用 xmlstarlet 来解决这个问题,但我是个新手,无法完成。 TIA!

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

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

如果可用,您可以使用:

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

命令降低所有策略//policy 检查 btw btw[text()='true'] 的文本值,如果是,它首先按名称向上移动 .. 收集 btw 的兄弟姐妹。

xmlstarlet 命令将 return 所有 <policynumber> 值,以空格分隔,在 <policy>s 内 <btw> 值等于 'true':

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