1

我制作了一个扫描 RSS 提要的程序。同样的程序从它爬取的元素创建提要。这意味着 rss 提要不相同,但项目必须相同。它复制它。因此,重要的是出来的东西和进来的东西是一样的。

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

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

现在,当我扫描它时,它工作得很好。元素被保存到数据库中,一切都很好。

当我尝试使用这些代码线(以及一堆 foreaches,如果是 +++)再次将其写出到 RSS 提要时

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 个项目。

然后我仔细查看了我从中获取这些元素的提要,它包含一个像这样的 rss 元素:

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

我目前正在尝试复制这一点。

有什么理由可以这样做吗?为什么?有没有更简单的方法来做到这一点?我是否必须为所有不同类型的标签添加 xmlns:dc 或 xmlns:itunes 或任何标签?

无论输入的 rss 提要中有什么内容,我都需要一种简单而安全的方法来处理这个问题。

4

1 回答 1

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>
于 2012-04-06T08:51:53.743 回答