需要找到XML元素的值
问题描述:
示例XML:需要找到XML元素的值
<parts>
<title>computer parts</title>
<components>
<hardware>motherboard</hardware>
<id>1234</id>
</components>
<part>
<item>motherboard</item>
<manufacturer>asus</manufacturer>
<model>p3b-f</model>
<cost> 123.00</cost>
</part>
<components>
<hardware>video card</hardware>
<id>2345</id>
</components>
<part>
<item>video card</item>
<manufacturer>ati</manufacturer>
<model>all-in-wonder pro</model>
<cost> 160.00</cost>
</part>
<components>
<hardware>sound card</hardware>
<id>3456</id>
</components>
<part>
<item>sound card</item>
<manufacturer>creative labs</manufacturer>
<model>sound blaster live</model>
<cost> 80.00</cost>
</part>
</parts>
在上面的示例XML,我需要在components
元素的值motherboard
第一搜索;如果在那里找到该值,那么我们需要搜索item
标记下的<part>
元素中的值,如果该值在item
标记中可用,那么我们应该得到model
标记的值。
注意:我突出显示了需要搜索的值和需要提取的值。
如何在Bash中做到这一点?
答
awk '/<hardware>/,/<\/hardware>/ { match($1,/<hardware>.*<\/hardware>/);prod=substr($1,RSTART+10,RLENGTH-21) } /<item>/,/<\/item>/ { match($1,/<item>.*<\/item>/);avail=substr($1,RSTART+6,RLENGTH-13) } /<model>/,/<\/model>/ { match($1,/<model>.*<\/model>/);if (prod=="motherboard" && avail=="motherboard") { print substr($1,RSTART+7,RLENGTH-15) } }' filename
我认为这是你是什么
/<hardware>/,/<\/hardware>/ {
match($1,/<hardware>.*<\/hardware>/)
prod=substr($1,RSTART+10,RLENGTH-21)
}
/<item>/,/<\/item>/ {
match($1,/<item>.*<\/item>/)
avail=substr($1,RSTART+6,RLENGTH-13)
}
/<model>/,/<\/model>/ {
match($1,/<model>.*<\/model>/)
if (prod=="motherboard" && avail=="motherboard") {
print substr($1,RSTART+7,RLENGTH-15)
}
}
设置搜索的硬件标记之后。将条目存储在变量prod中。搜索商品标签并存储包含的元素。搜索模型标签,然后如果同时使用主板和打印元素。
到目前为止您尝试过什么?你能告诉我们你的代码吗?你有没有尝试过使用'xmlstarlet'? –
请勿使用bash;相反,使用xmllint或xmlstartlet和xpath来完成此操作。理想情况下,您应该使用具有XML解析器的脚本语言。 – NinjaGaiden
你可以举一个例子,使用你给出的示例xml吗?我不明白你是否在寻找名为'motherboard'的标签或价值。 – Anubis