2013-01-08 44 views
1

我必須從XML文件中讀取特定的標籤屬性並將它們返回給模板文檔。
我已經完成了閱讀文件本身,現在我怎樣才能只讀取一個標籤並解析其屬性?Bash腳本:從XML文件中讀取特定的多行標籤並解析屬性

<?xml version="1.0" encoding="UTF-8"?> 
<instances 
name="instance-name" 
port="60535" 
username="bar" 
password="foo" 
string_var="barfoo"> 
some xml (up to 5k lines and 3 k elements i do not need) 
</instances> 

如何在讀取字符串直到遇到「>」實例?我怎樣才能把這些值變成變量?

通緝輸出:

TPAR_PORT = 60535 
TPAR_USERNAME = bar 
TPAR_PASSWORD = foo 
TPAR_INSTANCE = instance-name 

通過如果值是帶或不帶單引號

+0

可能的重複:http://stackoverflow.com/questions/4680143/how-to-parse-xml-using-shellscript – xiaoyi

+0

問題是從哪裏開始,如果行與kate或gedit分開,或者如果它的一行如在正常開放中那樣。我也只需要來自實例標籤的屬性。一些XML可以達到5k行的XML,我不想選擇解析器輸出... – Vogel612

+0

顯示一些代碼。顯示您的預期輸出。嘗試xmlstarlet,Nokogiri或其他一些XML解析器。 –

回答

1

使用適當的XML解析器沒關係的方式。您的示例不是格式良好的XML,但:XML聲明中不允許使用foobar,該聲明必須以?>結尾,而不是簡單的>。此外,應使用encoding而不是charset

修復文件後,您可以開始使用適當的工具。

<?xml version="1.0" charset="UTF-8"?> 
<instances 
name="instance-name" 
port="60535" 
username="bar" 
password="foo" 
string_var="barfoo"> 
some xml 
</instances> 

例如,你可以使用xmllint及其--shell選項:

$ xmllint 1.xml --shell <<<'cat /instances/@port' 
/> cat /instances/@port 
------- 
port="60535" 
/> 

我最喜歡的工具是xsh

$ xsh <<<'open 1.xml ; echo /instances/@port' 
60535 
0

這個怎麼樣

while read 
do 
    eval $REPLY 2>/dev/null 
done < a.xml 
相關問題