XMLStarlet-添加RSS提要项

XMLStarlet-添加RSS提要项,rss,xmlstarlet,Rss,Xmlstarlet,我一直在使用我在这里找到的一个例子,我只是注意到它没有正确地添加项目。下面的示例实际上是在通道标记之外添加项目。有人知道正确的方法吗 feed.xml: <?xml version="1.0" encoding="utf-8"?> <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> <channel> <title>My RSS Feed</title>

我一直在使用我在这里找到的一个例子,我只是注意到它没有正确地添加项目。下面的示例实际上是在通道标记之外添加项目。有人知道正确的方法吗

feed.xml:

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>My RSS Feed</title>
    <description>This is my RSS Feed</description>
  </channel>
</rss>
<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>My RSS Feed</title>
    <description>This is my RSS Feed</description>
  </channel>
  <item>
    <title>My RSS entry</title>
    <link>http://example.com/entry4711</link>
    <pubDate>Sat, 26 Jul 2014 01:14:30 +0200</pubDate>
    <description>Good news</description>
    <guid>http://example.com/entry4711</guid>
  </item>
</rss>
windows命令行示例:

xml ed -L -a "//channel" -t elem -n item -v "" -s "//item[1]" -t elem -n title -v "My RSS entry" -s "//item[1]" -t elem -n link -v "http://example.com/entry4711" -s "//item[1]" -t elem -n pubDate -v "Sat, 26 Jul 2014 01:14:30 +0200" -s "//item[1]" -t elem -n description -v "Good news" -s "//item[1]" -t elem -n guid -v "http://example.com/entry4711" -d "//item[position()>10]" feed.xml
output feed.xml:

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>My RSS Feed</title>
    <description>This is my RSS Feed</description>
  </channel>
  <item>
    <title>My RSS entry</title>
    <link>http://example.com/entry4711</link>
    <pubDate>Sat, 26 Jul 2014 01:14:30 +0200</pubDate>
    <description>Good news</description>
    <guid>http://example.com/entry4711</guid>
  </item>
</rss>

正如您在输出中看到的,该项添加在频道标签之外,因此提要不会验证。

在睡了一个好觉之后,实际上并没有那么难

每个项目都添加到通道标记之外的原因是因为我使用了

xml ed -L -a "//channel"
解决方案是在提要模板中使用一个标记,该标记在要添加的项中不使用。我在用发电机标签

添加了生成器标记的示例feed.xml:

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>My RSS Feed</title>
    <description>This is my RSS Feed</description>
    <link>http://example.com/entry4711</link>
    <generator>your-rss-generator</generator>
  </channel>
</rss>
Windows命令行,其中我将//频道替换为//生成器:

#!/bin/sh

TITLE="My RSS entry"
LINK="http://example.com/entry4711"
DATE="`date`"
DESC="Good news"
GUID="http://example.com/entry4711" 

xmlstarlet ed -L   -a "//generator" -t elem -n item -v ""  \
     -s "//item[1]" -t elem -n title -v "$TITLE" \
     -s "//item[1]" -t elem -n link -v "$LINK" \
     -s "//item[1]" -t elem -n pubDate -v "$DATE" \
     -s "//item[1]" -t elem -n description -v "$DESC" \
     -s "//item[1]" -t elem -n guid -v "$GUID" \
     -d "//item[position()>10]"  feed.xml ; 
xml ed -L -a "//generator" -t elem -n item -v "" -s "//item[1]" -t elem -n title -v "My RSS entry" -s "//item[1]" -t elem -n link -v "http://example.com/entry4711" -s "//item[1]" -t elem -n pubDate -v "Sat, 26 Jul 2014 01:14:30 +0200" -s "//item[1]" -t elem -n description -v "Good news" -s "//item[1]" -t elem -n guid -v "http://example.com/entry4711" -d "//item[position()>10]" feed.xml
这将使每个新项目都进入通道标记。

对于Windows命令行,^相当于shell脚本\