RSS フィードをスキャンするプログラムを作成しました。この同じプログラムは、クロールした要素からフィードを作成します。これは、RSS フィードは同一ではありませんが、アイテムは同一でなければならないことを意味します。それをコピーします。したがって、出てくるものは入ってくるものと同じであることが不可欠です。
現在、入力 rss の要素に次のような名前の要素が含まれている場合があります。
<dc:creator>tomatoes</dc:creator>
今、これをスキャンすると、完全に機能します。要素はデータベースに保存され、すべてがうまくいきます。
これらのコードライン (および +++ の場合は一連の foreach) を使用して、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 つ見つけました。
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フィードに何が入っても、これを処理する簡単で安全な方法が必要です。