2011-07-11 25 views
9

大量のXMLファイルでC#のXmlReaderを使用しようとしていますが、いくつかの選択肢を除いてすべて正しくフォーマットされています(残念ながら、なぜなら、それは他の多くのコードを壊すからです)。C#のXmlReaderをわずかに不正な形式のXMLで使用する

エラーは、これらの偽のXMLファイルの特定の部分から来ているだけですが、スキップするだけでOKですが、XMLファイルの残りの部分は読んでいません。

悪い部分は次のようになります。私は、無効なタグを無視、またはパイプ記号を無視することができれば

<InterestingStuff> 
    ... 
    <ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/> 
    <OtherInterestingStuff> 
    ... 
    </OtherInterestingStuff> 
</InterestingStuff> 

だから、本当に、私は大丈夫だろう。

"ErrorsHere"という名前が表示されているときにXmlReader.Skip()を使用しようとしても動作しませんが、明らかに先読み済みで例外をスローします。

TLDR:XmlReaderを使用して上記のXMLファイルを読むことができるようにするにはどうすればよいですか?

編集:

一部の人々は、単に置き換える提案|私は、ファイルから直接読んでいるので、私は、-symbolを、しかし、XmlReaderののアイデアはファイル全体をロードしないことですが、あなたがしたいだけトラバースパーツ「」ファイル全体の読み込みに余裕がない、 '|'のすべてのインスタンスを置き換えるもう一度パーツを読んでください:)。

+0

交換|読者を読み込む前に署名する - 問題を解決する可能性があります –

+0

どのようにXmlReaderに情報を読み込んでいますか?ストリームから読んでいますか? – Jethro

+3

事前にエラーがわかっている場合、解析する前にソースの内容を修正することはできませんか?しかし、一般的な方法では、ソースXMLを修正する必要があります....またはXML(私はあなたが他の誰かに依存していると思います...) –

答えて

4

これまで少し実験しました。

一般に、入力は単に整形式でなければなりません。 XmlReaderは、基本的なXMLルールが破損したときに回復不能なエラー状態になります。スキーマ検証を避けるのは簡単ですが、ここでは関係ありません。

唯一の選択肢はストリーミング(カスタムストリームまたはTextReader)で行うことができますが、軽い形式の解析が必要な入力を消去することです。あなたが有効な位置にパイプシンボルを持っていないなら、それは簡単です。

+0

ヘイックヘックス、これは私にとって最善の解決策のようです。私はまた、ファイル全体をロードしてパイプを交換しようとしましたが、これは(ロードされたデータを格納するためにメモリストリームを使用したとしても)解析に2倍の時間がかかりました。ストリームやTextReaderを拡張することは、パフォーマンスを維持し続けることをお勧めします。 –

1

XmlReaderは厳密です。不適合であればエラーになります。

あなたは独自のXML実装を記述しない限り、できません。おそらく、不正な形式のデータの修復が簡単です。

+0

もっと簡単で清潔な –

1

これまで(XMLファイルではなくHTMLファイルで)同様の状況がありました。しかし、各HTMLファイルの正規表現を使用して、オペレーションパイプラインに入力して、不正な部分を削除しました。それは便利だったし、APIと闘うよりも簡単でした。 :)

関連する問題