在linux中解析XML,打印多个元素


XML parsing in linux, print multiple elements

因此,我在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模板,您可以用任何需要特定解析的语言来获取该模板。