因此,我在linux中在线找到了一个用于xml解析的脚本,我希望能得到一些帮助,了解该脚本的工作原理,以及如何编辑它以供自己使用。
这是脚本(信用)
#!/bin/bash
cat $1 | awk '
START { pos=1; xml=$0 len=length(xml); endp=1 }
{ while(pos <= len) {
if(substr(xml,pos,7) == "<title>")
{
pos=pos+7;
endp=pos;
while((substr(xml,endp,8) != "</title>") && (endp < len))
{
endp++;
}
print " ",substr(xml,pos,endp-pos)," * ";
pos=endp+7;
}
pos++; } }'
以下是我将使用的xml数据的简化示例
我已经去掉了标签两侧的多余字符,并通过将脚本更改为这个进行了一些其他调整
#!/bin/bash
cat $1 | awk '
START { pos=1; xml=$0 len=length(xml); endp=1 }
{ while(pos <= len) {
if(substr(xml,pos,16) == "<sport><![CDATA[")
{
pos=pos+16;
endp=pos;
while((substr(xml,endp,11) != "]]></sport>") && (endp < len))
{
endp++;
}
print "",substr(xml,pos,endp-pos),"";
pos=endp+10;
}
pos++; } }'
所以使用这个脚本给我留下了一个纯文本文件,结果是
Women's Soccer
Men's Soccer
Women's Soccer
最终,我希望有一个脚本输出以下
Women's Soccer Away @ South Carolina (Exhibition) at 7:00 PM
Men's Soccer Home vs. Ohio State at 7:00 PM
Women's Soccer Away @ William and Mary at 7:00 PM
对于那些想知道的人来说,这是调用解析脚本(忽略文件名和位置)的shell
wget -O rss.xml http://en-us.fxfeeds.mozilla.com/en-US/firefox/headlines.xml
~dsl/bin/rssparse! rss.xml > headlines_$$.tmp
cd /tmp/ldmtrx
split --lines=30 /tmp/headlines_$$.tmp ldmtrxnews
cd /tmp
rm headlines_$$.tmp rss.xml
虽然我们将不胜感激,但我不希望有人帮我完成这项任务,我只想得到一些提示和帮助。我不知道如何在不同的元素上运行此脚本,然后打印两个元素(例如<sport>
和<homeaway>
)。我可以再次运行该脚本,但随后元素将打印在不同的行上。
最后,我想知道如何排除所有<date>
与今天日期不匹配的数据。谢谢你的帮助。
您必须知道您的示例缺乏验证。它需要一些调整
检查这个馅饼而不是那个馅饼
然后使用xmlstarlet,您可以取代这个脚本所做的所有工作。
$ wget --output-document - http://pastie.org/pastes/4408130/download | xmlstarlet sel -t -m rss/channel/item -v sport -o ' Away @ ' -v opponent -o ' at ' -v time -na
输出:
Women's Soccer Away @ South Carolina (Exhibition) at 7:00 PM
Men's Soccer Away @ Ohio State (Exhibition) at 7:00 PM
Women's Soccer Away @ William and Mary at 7:00 PM
当输出满足您的需要时,您可以使用-C和xmlstarlet来显示一个xml模板,您可以用任何需要特定解析的语言来获取该模板。