xml解析和逆转顺序

时间:2013-05-15 14:59:09

标签: xml xml-parsing

当然我正在学习如何做到这一点,但我认为我正在努力实现这一目标

我们,我已经获得了这个xml文件。它只是由一堆事件数据组成,但需要这些数据的组需要反转数据。目前,它不会首先显示最近的日期。

解析此文件的最佳方法是什么,反转顺序然后在xml中将其吐出来?

任何帮助都将不胜感激。

下面的xml示例:我想为每个事件重新排序/反向排序位置字段/节点[1-4]

<rss version="2.0">
    <channel>
        <title>Thunder Dome - Calendar - Villiage Ctr</title>
        <link>https://www.??????/?????.aspx</link>
        <update>Wed, 15 June 2013 09:30 -0500</update>
        <location>Thunder Dome - Upcoming Events</location>
        <language>en-us</language>
        <item>
            <title>Event 1</title>
            <link>https://www.??????/?????.aspx</link>
            <pubDate>Wed, 15 June 2013 08:46 -0500</pubDate>
            <location>June 29, 2013<br>, 8:00 AM, Town Square</location>
            <guid>https://www.??????/?????.aspx</guid>
        </item>
        <item>
            <title>Event 2</title>
            <link>https://www.??????/?????.aspx</link>
            <pubDate>Wed, 15 June 2013 08:43 -0500</pubDate>
            <location>June 23, 2013<br>, 6:00 PM, Danny's Bar and Grill</location>
            <guid>https://www.??????/?????.aspx</guid>
        </item>
        <item>
        <title>Event 3</title>
            <link>https://www.??????/?????.aspx</link>
            <pubDate>Wed, 15 June 2013 08:43 -0500</pubDate>
            <location>June 21, 2013<br>, 7:00 PM, Auditoriam</location>
            <guid>https://www.??????/?????.aspx</guid>
        </item>
        <item>
            <title>Event 4</title>
            <link>https://www.??????/?????.aspx</link>
            <pubDate>Wed, 15 June 2013 09:30 -0500</pubDate>
            <location>June 20, 2013<br>, 6:30 PM, Grarage</location>
            <guid>https://www.??????/?????.aspx</guid>
        </item>
    </channel>
</rss>

2 个答案:

答案 0 :(得分:1)

在XSLT中执行此操作非常容易。虽然为这项任务学习一门新语言可能会带来一些开销,但这些技能将随后用于任何XML工作。

您基本上需要两个模板规则。第一个复制所有内容:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

,第二个处理channel元素中项目的重新排序:

<xsl:template match="channel">
  <xsl:apply-templates select="*[not(self::item)]"/>
  <xsl:apply-templates select="item">
    <xsl:sort select="-position()" data-type="number"/>
  </xsl:apply-templates>
</xsl:template>

答案 1 :(得分:0)

如果您知道如何使用XSLT,那么以前的文章就是您正在描述的内容:

XSLT: How to reverse output without sorting by content

您发布的XML无效,首先关闭,因此如果您要解析它,则必须使用CDATA部分包围<location>元素,如下所示:

<location><![CDATA[June 29, 2013<br>, 8:00 AM, Town Square]]></location>

如果只是<location>节点要反转日期和地点的顺序,那么输出如下:

<location>Town Square, June 29, 2013<br>, 8:00 AM</location>

您可以在不解析XML的情况下离开,只需使用正则表达式来交换该特定节点的顺序:

sed 's/<location>\(.* [AP]M\), \(.*\)</<location>\2, \1</g' rss.xml