我有一个输入RSS Feed,其中一些元素已经添加了命名空间前缀(用于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>
尽管我的问题很长,但我希望得到几行代码作为答案,确保必须有一些简单的东西我不知道:)
答案 0 :(得分:0)
我无法重现你说的问题,以下简单的样本
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/
带有斜杠“/”。这可能就是你遇到问题的原因。