1

所以我在网上找到了一个我想要使用的用于在 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>与今天日期不匹配的数据。谢谢你的帮助。

4

1 回答 1

1

您必须知道您的示例缺乏验证。它需要一些调整

检查这个馅饼而不是那个馅饼

然后使用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 模板,你可以使用任何你需要特定解析的语言来获取。

于 2012-08-07T22:03:14.307 回答