2016-04-14 144 views
1

請參閱下面的XML示例。Bash - 從XML中提取數據

使用bash腳本,我該如何將XML文件中所有「from」標籤之間的字符串提取爲數組?
即喜歡的東西陣列= [奔,賈尼,詹姆斯,哈利,...]

示例XML文件:

<note> 
<to>Tove</to> 
<from>Ben</from> 
<heading>Reminder</heading> 
<body>Don't forget me this weekend!</body> 
</note> 
<note> 
<to>Tove</to> 
<from>Jani</from> 
<heading>Reminder</heading> 
<body>Don't forget me this weekend!</body> 
</note> 
<note> 
<to>Tove</to> 
<from>James</from> 
<heading>Reminder</heading> 
<body>Don't forget me this weekend!</body> 
</note> 
+0

你能告訴我們你是如何試圖解決這個問題的嗎? – nyname00

+0

您應該添加一個根元素。例如,像。 –

回答

0

編輯:@jil已通知我,我最初的解決方案僅適用如果XML文件被格式化爲OP粘貼,但如果每行有多個<from>標籤,則該文件將失敗。下面的代碼解決了問題,因爲它首先刪除所有新行字符:

#!/bin/bash 

NAMES=() 
one_line=$(sed "s/\n//g" file.xml) 
from_names=$(echo $one_line | grep -Po "<from>(.*?)<\/from>") 

for word in $from_names 
do 
    name=$(echo $word | sed -n "s/<from>\(.*\)<\/from>/\1/p") 
    NAMES+=($name) 
done 

echo ${NAMES[@]} 

那麼你可以參考一下每個名字一樣${NAMES[0]}${NAMES[1]}${NAMES[2]}

echo ${NAMES[@]}在腳本打印結束列出列表中的所有元素,並且非常適合測試。

+0

如果每個輸入行有多個XML標記,將會中斷。 – jil

+0

@jil編輯我的代碼來解決這個問題。現在應該工作正常。 – drewyupdrew

-1

你想使用一些XML shell工具,如xmlstarletxmllint的XPath(從XML :: XPath的的Perl模塊)。

E.g.使用的XPath:使用xmllintsed的

array=($(xpath -q -e "//from/text()" input_file.xml)) 

array=($(xmllint --xpath '//from' input_file.xml \ 
      | sed 's#</\?from># #g')) 

附:您的示例輸入格式不正確(它缺少根元素)

0

這不是一個xml知道命令,預計這些標記位於每個單獨的行上。

$ arr=$(sed -rn 's_<from>(.*)</from>_\1_p' xml) 
$ echo ${arr[@]} 
Ben Jani James