2012-05-11 86 views
1

我正在寫一個小腳本,解析rss使用xmllint。Bash腳本和xml/rss解析

現在我取的標題列表使用下面的命令:

ITEMS=`echo "cat //title" | xmllint --shell rss.xml ` 
echo $ITEMS > tmpfile 

但它返回:

<title>xxx</title> ------- <title>yyy :)</title> ------- <title>zzzzzz</title> 

不換行,或空間。 現在我感興趣的只是標題標籤的文本內容,如果可能的話我希望通過標題導航使用for/while循環,是這樣的:

for val in $ITEMS 
do 
     echo $val 
done 

如何可以做到? 在此先感謝

+1

不要成爲受虐狂,使用腳本語言如Python,紅寶石,世界上任何其他語言,perl(按照優先順序:P) – KurzedMetal

+2

@KurzedMetal你可以做很多解析和分裂並在bash中迭代。 –

+0

你會發現引用你的變量將有很大的幫助:'for val in「$ ITEMS」;做回聲「$ val」;完成' –

回答

3

我在某些時候需要相同類型的需求來解析bash中的xml。我結束了使用xmlstarlet http://xmlstar.sourceforge.net/,你可能會安裝。

如果沒有,這樣的事情將刪除surounding標籤:管道之後

echo "cat //title/text()" | xmllint --shell rss.xml 

然後,你將需要清理的輸出,一個基本的解決辦法是:

echo "cat //title/text()" | xmllint --shell rss.xml | egrep '^\w' 

希望這幫助

2

要回答你的第一個問題,$ITEMSecho的不加引用的使用正在消除你的新的字符。嘗試

ITEMS=`echo "cat //title" | xmllint --shell rss.xml ` 
echo "$ITEMS" > tmpfile 
#----^------^--- dbl-quotes only 

一般情況下,使用for循環最好是留給不會產生意想不到的空格或其他非打印字符的項目。 (非字母數字),像for i in {1..10} ; do echo $i; done

,你不真正需要的變量或臨時文件,試

echo "cat //title" | xmllint --shell rss.xml | 
    while read line ; do 
     echo "$line" 
    done 

取決於什麼是你RRS喂,你還可以從改變中受益所使用的讀CMD默認IFS(內部字段分隔符),嘗試

while IFS= read line .... 
# or 
while IFS="\n" read line 
# or 
while IFS="\r\n" read line 

我不知道你想實現與echo "cat //title" |進入xmllint什麼,所以我把它當作是。這是一個指示xmllint?或者它是否通過爲文檔創建標題? (現在不要讓xmllint使用expermient)。

此外,你可能想看看reading rss feeds with awk,但它是相當低的水平。

我希望這會有所幫助。

+0

yes是對xmllint的指令,請檢查我是否更新了該問題,因爲我注意到我提供的示例中缺少一些charcater。謝謝:D – Ivan

+0

我沒有看到你的新帖子和我用作主要命令的東西之間有什麼不同。是在cmd或在您的採樣電流輸出的變化? **我還在編輯答案,請稍後再回來。**祝你好運。 – shellter

+0

@Ivan完成了我的編輯。祝你好運。 – shellter