0

前方専用リーダーであるXmlReaderクラスを使用しています。私が呼び出しているメソッドは、副作用としてカーソルを移動します。ただし、メソッドが例外をスローし、カーソルが予期しない場所に残ることがあります。どうすればそれを処理できますか?

xml.ReadStartElement("root");

if (xml.IsStartElement("Results"))
{
    try
    {
        results = Results.FromXml(xml);
        // if method successful, it reads past the closing tag of the 'Results' element
    }
    catch
    {
        results = null;
        // I want to manually move the cursor past the closing tag of the 'Results' element.
    }
}

文書例

<root>
    <results>
        <arbitaryxml/>
    </results>*
    <signatures>

Results.FromXml メソッドが成功すると、カーソルは * に残ります。ただし、失敗した場合は、結果要素内のどこかに残っている可能性があります。カーソルが * に進んでいることを確認するキャッチ ブロックが必要です。(NB。次の要素は常に「署名」と呼ばれるわけではありません)。

これを説明するのはかなり難しいと思いました。説明が必要かどうか尋ねてください。もっと例を挙げることができます。

4

2 に答える 2

1

必要なことを行うReadSubtreeメソッドを見てください。実際には、最後の要素ノードに配置されますが、目的は達成されます。通常、次のように記述します。

XmlReader resultsReader = reader.ReadSubtree();
while (resultsReader.Read())
{
    // process results node here
}

返された後ReadSubtree、 を呼び出すと、 EndElement ノードreader.Readが返されます。</results>したがって、結果の処理で例外がスローされた場合でも、適切な場所にいます。

ReadSubtree例外がスローされた場合、それはもちろん回復不能です。これは XML のエラーを示しており、私が確認した限りでは、XmlReader.

于 2013-03-21T14:43:21.827 に答える