2012-04-06 6 views
1

RSSフィードをスキャンするプログラムを作成しました。この同じプログラムは、クロールした要素からフィードを作成します。これは、rssフィードが同一ではないことを意味しますが、項目は一致する必要があります。それはそれをコピーする。何が出てくることに来る同じものであることが必須であるC#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の別のオーバーロードされたメソッドを使用することができ、一例を発見し、この1:

<dc:creator xmlns:something="NameSpace">tomatoes</dc:creator> 

これはあなたのように、次のとおりです。

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

は、しかし、これはこのように見える要素を引き起こし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フィードに何が入っていても、これを処理する簡単で安全な方法が必要です。

+0

を与えます。 'dc:'はネームスペースです。 –

+0

私はLinqのためXDocumentが遅いと言われました。この場合の操作は、速度にも影響されます。これが唯一のオプションだと私はそこに行かなければならないと思いますが、それでも軽量を使うことができるなら私はこれを好むでしょう。 –

+0

LinqでXDocumentを使う必要はありません。単なる良いオプションです。主なものは次のとおりです.XML全体をメモリにロードする余裕はありますか? –

答えて

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"))) ; 

はドロップXDocumentの賛成でのXmlWriter

<items xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <item> 
    <title>test</title> 
    <dc:creator>tomatoes</dc:creator> 
    </item> 
</items> 
+0

私はこれを試してみます) –

+0

これは私が思いついたことですが、 "旧式の" Xmlライブラリでもできます。ちょっと厄介です。 –