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提要中有什么内容。

C#正在复制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>