C#重现RSS提要

时间:2012-04-06 08:25:53

标签: c# xmlwriter

我制作了一个扫描rss feed的程序。该程序从已爬网的元素创建订阅源。这意味着rss提要不相同,但项目必须是。它复制它。因此,出现的内容必然是同样的事情。

现在,输入rss中的elmenents出现了具有如下名称的元素:

<dc:creator>tomatoes</dc:creator>

现在,当我扫描它时它完美无缺。该元素保存到数据库,一切都非常好。

当我尝试再次将其写入RSS源时,使用这些代码行(以及一堆foreaches,如果是+++)

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位。

我还尝试了另一个'hack',它的工作原理如下:

StringBuilder sb = new StringBuilder();
StringWriter stringWriter = new StringWriter(sb);
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

feedWriter.WriteElementString(keyAndValue[0], keyAndValue[1]);

这构建并没有返回错误,但是当我在Firefox中打开它时,它显示0项。

然后我仔细研究了我从这里得到这些元素的feed,它包含了一个像这样的rss元素:

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

我目前正在尝试复制此内容。

这可能有用吗?为什么? 有更简单的方法吗? 我是否必须添加xmlns:dc或xmlns:itunes或其他所有不同类型标签的标签?

无论输入rss feed中是什么,我都需要一种简单而安全的方法来解决这个问题。

1 个答案:

答案 0 :(得分:2)

使用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>