C#正在复制RSS提要
本文关键字:RSS 提要 复制 | 更新日期: 2023-09-27 18:30:07
我制作了一个扫描rss提要的程序。这个程序从它已爬网的元素中创建提要。这意味着rss提要不完全相同,但项目必须相同。它会复制它。因此,重要的是,出来的东西和进来的东西是一样的。
现在,有些情况下,输入rss中的elmenents具有名称如下的元素:
<dc:creator>tomatoes</dc:creator>
现在,当我扫描这个时,它工作得很好。元素被保存到数据库中,一切都非常好。
当我尝试再次将它写到RSS提要时,使用这些代码行(和一堆foreach,如果是+++)
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = " ";
settings.NewLineOnAttributes = true;
XmlWriter feedWriter = XmlWriter.Create(sb, settings);
每种元素的这一行:
feedWriter.WriteElementString(keyAndValue[0], keyAndValue[1]);
如果我点击上面的示例元素,就会收到这个错误消息:
Invalid name character in 'dc:creator'. The ':' character, hexadecimal value 0x3A, cannot be included in a name.
现在,我发现很多文章都提到了这个错误。在几乎所有的测试中,提问者都被告知这不是正确的XML,应该放弃写":"。但是我不能。
我发现了一个例子,你可以使用XmlWriter的另一个重载方法,这个:
feedWriter.WriteElementString(prefixAndKey[0],prefixAndKey[1],"Namespace",keyAndValue[1]);
然而,这导致元素看起来像这样:
<dc:creator xmlns:something="NameSpace">tomatoes</dc:creator>
正如大家所知,这与上面的不同,因为它包含xmlns位。
我还尝试了另一个"黑客",其工作原理如下:
StringBuilder sb = new StringBuilder();
StringWriter stringWriter = new StringWriter(sb);
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);
和
feedWriter.WriteElementString(keyAndValue[0], keyAndValue[1]);
它构建并没有返回错误,但当我在Firefox中打开它时,它显示了0个项目。
然后,我仔细查看了从中获取这些元素的提要,其中包含一个rss元素,如下所示:
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
我目前正在尝试复制它。
这可能奏效有原因吗?为什么?有更简单的方法吗?我是否必须为所有不同类型的标签添加xmlns:dc或xmlns:itunes或任何标签?
我需要一种简单而安全的方法来处理这个问题,无论输入rss提要中有什么内容。
XDocument:的快速片段
XNamespace dc = @"http://purl.org/dc/elements/1.1/";
XElement doc = new XElement("items",
new XAttribute(XNamespace.Xmlns + "dc", dc),
new XElement("item",
new XElement("title", "test"),
new XElement(dc + "creator", "tomatoes"))) ;
提供
<items xmlns:dc="http://purl.org/dc/elements/1.1/">
<item>
<title>test</title>
<dc:creator>tomatoes</dc:creator>
</item>
</items>