0

当然,我只是在学习这样做,但我认为我让它变得比需要的更难

我们,好吧,我已经得到了这个 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>
4

2 回答 2

1

在 XSLT 中很容易做到这一点。尽管为该任务学习一门新语言可能有点开销,但这些技能将在任何后续的 XML 工作中派上用场。

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

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

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

<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>
于 2013-05-15T17:22:17.173 回答
0

如果您知道如何使用 XSLT,这里是之前的一篇文章,按照您的描述进行:

XSLT:如何在不按内容排序的情况下反转输出

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

<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
于 2013-05-15T15:10:04.843 回答