2013-04-04 12 views
7

XmlWriterでxmlを書いています。私のコードは次のようにセクションがたくさんあります。WriteEndElementで要素の名前を確認する方法

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

問題はThirdPartyLibrary.Serialise方法の信頼性が低いということです。開いたタグをすべて閉じることはできません(変数resultsによる)。結果として、私のWriteEndElement行は、逆転し、</payload>と書くのではなく、ライブラリのハンギングタグを閉じるのに費やされました。

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

xml.WriteEndElement("payload"); 

は、カーソルが文書内の予想される場所である場合を除き投げるこのようなXmlReader.ReadStartElement(name)と考えることができます。

どうすればこの問題を解決できますか?


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

+0

新しい 'XmlWriter'を 'ThirdPartyLibrary.Serialise'に送り、それを' xml'オブジェクトに追加する前にその明示性をチェックできますか? – zimdanen

+0

''結果 'を' Serialise'に渡す前に何とか検証できますか? (つまり、特定のタイプの結果を渡すときにserialiseメソッドの中断を再現することができます) – keyboardP

+0

@KeyboardP - サードパーティのライブラリは、実際にはインターフェイスを実装するユーザー提供のプラグインなので、信頼できません。 –

答えて

0

は、私は、この使用可能なAPIを提供します拡張子メソッドWriteSubtreeを書きました。面白いビジネスをチェックする特別なXmlWriterを返します。そのdisposeメソッドは、開いたままのタグを閉じます。

1

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

XMLWriterを使用してXMLファイルを作成することは、開発者の責任で行ってください。そのような検証をしたい場合は、XMLDocumentを使用できます。

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

私はこれらのタイプのXMLを作成するためにXMLDocumentを使用することをお勧めします。 .NETのXmlReader.ReadSubtreeに似ているXmlWriter.WriteSubtree

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

拡張メソッド:最後に

関連する問題