需要在XML中找到元素的值

时间:2017-08-24 11:31:00

标签: xml bash shell unix scripting

示例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中,我需要先在motherboard元素中搜索值components;如果在那里找到了值,那么我们需要在<part>标记下的item元素中搜索该值,如果该值在item标记中可用,那么我们应该得到model代码的值。

注意:我突出显示了需要搜索的值和需要提取的值。

我怎样才能在Bash中做到这一点?

1 个答案:

答案 0 :(得分:0)

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中。搜索项目标记并将包含的元素存储在可用中。搜索模型标签,然后如果prod和avail两个相同的主板,打印元素。