根据特定标签的内容从 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
我有一个 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