当然我正在学习如何做到这一点,但我认为我正在努力实现这一目标
我们,我已经获得了这个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>
答案 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