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 方法成功,光标将留在*。但是,如果失败,它可能会留在结果元素内的任何位置。我希望我的 catch 块确保光标前进到 *. (注意。下一个元素并不总是称为“签名”)。

我发现这很难解释。请问是否需要澄清,我可以举更多的例子。

4

2 回答 2

1

看看ReadSubtree方法,它会做你想做的事。实际上,它定位到结束元素节点,但它完成了你想要的。通常,您会编写如下内容:

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

返回后ReadSubtree,调用reader.Read将返回</results>EndElement 节点。因此,如果处理结果引发异常,您仍然在正确的位置。

如果ReadSubtree抛出异常,那当然是不可恢复的。这表明 XML 中存在错误,据我所知,使用XmlReader.

于 2013-03-21T14:43:21.827 回答
0

Jim 是对的,ReadSubtree方法有效,尽管它有点繁琐:

if (xml.IsStartElement("Results"))
{
    // Be careful so that the cursor will be left after the closing tag of the 'Results' element, even if Results.FromXml throws.

    using (XmlReader resultsElement = xml.ReadSubtree())
    {
        resultsElement.Read();
        try 
        {
            results = Results.FromXml(resultsElement);
        }
        catch (Exception e)
        {
            Console.Error.WriteLine("Reading results xml went wrong {0}", e.Message);
        }
    }

    xml.ReadEndElement();
}
于 2013-04-04T12:59:53.350 回答