在不修改现有命名空间前缀的情况下,向现有RSS添加新的RSS元素
本文关键字:RSS 添加 元素 命名空间 前缀 情况下 修改 | 更新日期: 2023-09-27 18:00:13
我有一个输入RSS提要,其中一些元素已经添加了名称空间前缀(用于itunes)。在不删除属性并再次在C#中添加的情况下,添加一个元素,例如<itunes:subtitle>
作为名称空间,该元素是<subtitle>
期望输出:
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd/" version="2.0">
<channel>
<title>channelTitle</title>
<itunes:subtitle>subtitle_description</itunes:subtitle>
<item>
<title>item1</title>
<itunes:subtitle>A short description</itunes:subtitle>
</item>
</channel>
</rss>
输入XML:
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd/" version="2.0">
<channel>
<item>
<title>item1</title>
<itunes:subtitle>A short description</itunes:subtitle>
</item>
</channel>
</rss>
如何在C#中添加另一个元素,同时维护现有的名称空间:element?我必须在代码中再次显式添加名称空间(名称空间也应该存在于输入XML中,否则它将处理无效的XML:
参见代码:
XNamespace itunes = "http://www.itunes.com/dtds/podcast-1.0.dtd/";
string rssFeed = "<rss xmlns:itunes='"http://www.itunes.com/dtds/podcast-1.0.dtd'" version='"2.0'"><channel><item><title>item1</title><itunes:subtitle>A short description</itunes:subtitle></item></channel></rss>";
XDocument XMLDoc = XDocument.Parse(rssFeed);
XMLDoc.Root.RemoveAttributes();
XMLDoc.Root.Add(new XAttribute(XNamespace.Xmlns + "itunes", itunes.NamespaceName));
//Without adding the namespace attribute explicitly, the xmlns attribute is added instead to <subtitle> instead of <itunes:subtitle> :
XMLDoc.Element("rss").Element("channel").AddFirst(
new XElement("title", "channelTitle"),
new XElement(itunes + "subtitle", "subtitle_description")
);
正确添加。然而,现在在输入XML中发生了更改,输出:
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd/">
<channel>
<title>channelTitle</title>
<itunes:subtitle>subtitle_description</itunes:subtitle>
<item>
<title>item1</title>
<subtitle xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd">A short description</subtitle>
</item>
</channel>
</rss>
方法2:
XNamespace itunes = "http://www.itunes.com/dtds/podcast-1.0.dtd/";
string rssFeed = "<rss xmlns:itunes='"http://www.itunes.com/dtds/podcast-1.0.dtd'" version='"2.0'"><channel><item><title>item1</title><itunes:subtitle>A short description</itunes:subtitle></item></channel></rss>";
XDocument XMLDoc = XDocument.Parse(rssFeed);
XMLDoc.Element("rss").Element("channel").AddFirst(
new XElement("title", "channelTitle"),
new XElement(itunes + "subtitle", "subtitle_description")
);
Console.WriteLine(XMLDoc);
输出:
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>
<title>channelTitle</title>
<subtitle xmlns="http://www.itunes.com/dtds/podcast-1.0.dtd/">subtitle_description</subtitle>
<item>
<title>item1</title>
<itunes:subtitle>A short description</itunes:subtitle>
</item>
</channel>
</rss>
尽管我的问题很长,但我希望能得到几行代码作为答案,当然我遗漏了一些简单的东西:)
我无法重现您所说的面临的问题,下面是简单的示例
string rssFeed = "<rss xmlns:itunes='"http://www.itunes.com/dtds/podcast-1.0.dtd'" version='"2.0'"><channel><item><title>item1</title><itunes:subtitle>A short description</itunes:subtitle></item></channel></rss>";
XDocument XMLDoc = XDocument.Parse(rssFeed);
XNamespace itunes = XMLDoc.Root.GetNamespaceOfPrefix("itunes");
XMLDoc.Element("rss").Element("channel").AddFirst(
new XElement("title", "channelTitle"),
new XElement(itunes + "subtitle", "subtitle_description")
);
XMLDoc.Save(Console.Out);
Console.WriteLine();
与一起跑步时。NET 3.5,输出
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>
<title>channelTitle</title>
<itunes:subtitle>subtitle_description</itunes:subtitle>
<item>
<title>item1</title>
<itunes:subtitle>A short description</itunes:subtitle>
</item>
</channel>
</rss>
仔细查看您的代码,唯一的问题是,有些示例使用URI http://www.itunes.com/dtds/podcast-1.0.dtd
,而有些示例的http://www.itunes.com/dtds/podcast-1.0.dtd/
后面带有斜杠"/"。所以这可能就是你遇到问题的原因。