我制作了一个扫描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中是什么,我都需要一种简单而安全的方法来解决这个问题。
答案 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>