2017-08-24 52 views
0

示例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中做到这一点?

+2

到目前为止您尝试过什么?你能告诉我们你的代码吗?你有没有尝试过使用'xmlstarlet'? –

+2

请勿使用bash;相反,使用xmllint或xmlstartlet和xpath来完成此操作。理想情况下,您应该使用具有XML解析器的脚本语言。 – NinjaGaiden

+0

你可以举一个例子,使用你给出的示例xml吗?我不明白你是否在寻找名为'motherboard'的标签或价值。 – Anubis

回答

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中。搜索商品标签并存储包含的元素。搜索模型标签,然后如果同时使用主板和打印元素。