0

我正在使用 CMS,并找到了一个从文件夹中的内容生成 rss 提要的功能。但是,我希望从列表中删除其中的一行。我已经完成了我的研究,我“认为”我应该使用 XmlDocument 类来帮助我删除我不想要的行。我已经使用 Firebug 和 FirePath 来获取 XPath - 但我似乎无法弄清楚如何正确应用它。我也不确定我应该使用 .Load 还是 .LoadXml - 我使用了后者,好像提要显示正常。但是我不得不转换 ToString() 来摆脱那个重载的匹配错误......

我要删除的行称为“存档平面”我为 FirePath 获得的 XPath 是“.//*[@id='feedContent']/xhtml:div[11]/xhtml:h3/xhtml:a”

我还假设 .RemoveChild(node); 在我 Response.Write 之前将其从 rssData 中删除。谢谢

Object rssData = new object();
Cms.UI.CommonUI.ApplicationAPI AppAPI = new Cms.UI.CommonUI.ApplicationAPI();
rssData = AppAPI.ecmRssSummary(50, true, "DateCreated", 0, "");
Response.ContentType = "text/xml";

XmlDocument xmlDocument = new XmlDocument();

xmlDocument.LoadXml(rssData.ToString());

XmlNode node = xmlDocument.SelectSingleNode(@"xhtml:div/xhtml:h3/xhtml[a = 'Archived Planes']");

    if (node != null)
    {
        node.ParentNode.RemoveChild(node);
    }

Response.Write(rssData);

编辑以包括下面的输出

This is the what the response.write from rssData is pumping out:
<?xml version="1.0" ?> 
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
<channel>
<title>Plane feed</title>
<link>http://www.domain.rss1.aspx</link>
<description></description>
<item>
<title>New Planes</title>
<link>http://www.domainx1.aspx</link>
<description>
This is the description
</description>
<author>Andrew</author>
<pubDate>Thu, 16 Aug 2012 15:55:53 GMT</pubDate>
</item>
<item>
<title>Archived Planes</title>
<link>http://www.domain23.aspx</link>
<description>
Description of Archived Planes
</description>
<author>Jan</author>
<pubDate>Wed, 15 Aug 2012 10:34:23 GMT</pubDate>
</item>
</channel>
</rss>

4

3 回答 3

1

我怀疑您的 xpath 不正确,它看起来像您正在引用的一些时髦的 dom 元素,而不是 xml 元素......例如对于以下 xml

<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<NewDataSet>
 <userinfo>
     <username>pqr2</username>
     <pass>abc</pass>
     <addr>abc</addr>
 </userinfo>

 <userinfo>
     <username>pqr1</username>
     <pass>pqr2</pass>
     <addr>pqr3</addr>
 </userinfo>
</NewDataSet>

此代码将删除用户名元素为 pqr1 的 userinfo 节点

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(@"file.xml");
XmlNode node = xmlDocument.SelectSingleNode(@"NewDataSet/userinfo[username = 'pqr1']");

if (node != null) {
  node.ParentNode.RemoveChild(node);
  xmlDocument.Save(@"file.xml");
}
于 2012-08-22T14:59:43.890 回答
0

以为我会发布答案,尽管我会将 Pauls 标记为答案,因为他的代码/建议是我进一步研究的基础。仍然不知道 SelectSingleNode 中的“@”是什么以及我是否真的应该拥有它 - 将做更多的研究。

    Object rssData = new object();
    Cms.UI.CommonUI.ApplicationAPI AppAPI = new Cms.UI.CommonUI.ApplicationAPI();
    rssData = AppAPI.ecmRssSummary(50, true, "DateCreated", 0, "");
    Response.ContentType = "text/xml";
    Response.ContentEncoding = System.Text.Encoding.UTF8;

    XmlDocument xmlDocument = new XmlDocument();

    xmlDocument.LoadXml(rssData.ToString());

    XmlNode node = xmlDocument.SelectSingleNode("rss/channel/item[title = 'Archived Planes']");

    if (node != null)
        try
        {
            node.ParentNode.RemoveChild(node);
            xmlDocument.Save(Response.Output);
        }
        catch { }

    else { Response.Write(rssData); }
}
于 2012-08-22T21:47:58.857 回答
0

@ 符号只是表示逐字字符串文字(与普通字符串声明相比,允许您在字符串中使用时髦的字符),例如

string e = "Joe said \"Hello\" to me";      // Joe said "Hello" to me
string f = @"Joe said ""Hello"" to me";   // Joe said "Hello" to me

有关详细信息,请参阅此 msdn 链接

于 2012-08-23T09:12:23.207 回答