7

XmlWriterで xml を書いています。私のコードには、次のようなセクションがたくさんあります。

xml.WriteStartElement("payload");
ThirdPartyLibrary.Serialise(results, xml);
xml.WriteEndElement(); // </payload>

問題は、このThirdPartyLibrary.Serialise方法が信頼できないことです。(変数によってはresults) 開いているすべてのタグが閉じられない場合があります。結果として、私の WriteEndElement 行は倒錯し、ライブラリのハンギング タグを閉じるのではなく、</payload>.

したがって、要素名をチェックし、カーソルが予期される要素にない限り、例外をスローする WriteEndElement へのチェック呼び出しを行いたいと思います。

xml.WriteEndElement("payload");

XmlReader.ReadStartElement(name)これは、カーソルがドキュメント内の予期される場所にない限りスローされると考えることができます。

どうすればこれを達成できますか?


編集: この拡張メソッドの 2 番目の使用例は、自分のコードをより読みやすく信頼できるものにすることです。

4

2 に答える 2

1

XMLWriter は、指定された xml 情報を検証なしでストリームに書き込むだけです。xml タグの書き込み中に検証を行うと、大きな xml ファイルの作成中にパフォーマンスの問題が発生します。

XMLWriter を使用して XML ファイルを作成するかどうかは、開発者の責任です。このような種類の検証を行いたい場合は、XMLDocument を使用できます。

XMLWriter でこの検証を本当に実行したい場合は、String または StringBuilder を使用してライターを作成する必要があります。なぜなら、Stream や TextWriter を使用すると、書き込み途中でストリームに書き込まれた情報を読み取ることができないからです。XML を更新するたびに、文字列を読み取り、独自のメソッドを作成して、書き込まれた情報を検証する必要があります。

これらのタイプの xml を作成するには、XMLDocument を使用することをお勧めします。

于 2013-05-31T07:01:00.373 に答える
0

WriteSubtree最後に、この使用可能な API を提供する拡張メソッドを作成しました。

using (var resultsXml = xml.WriteSubtree("Results"))
{
    ThirdPartyLibrary.Serialise(results, resultsXml);
}

拡張メソッドXmlWriter.WriteSubtreeは、.NET のXmlReader.ReadSubtree. 面白いビジネスをチェックする特別な XmlWriter を返します。その dispose メソッドは、開いたままのタグを閉じます。

于 2013-05-31T10:23:47.883 に答える