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