2017-08-24 50 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中。搜索商品標籤並存儲包含的元素。搜索模型標籤,然後如果同時使用主板和打印元素。