如何使用XmlReader可靠地工作

时间:2013-03-21 13:58:34

标签: c# .net xmlreader

我正在使用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块确保光标前进到*。 (注意。下一个元素并不总是称为'签名')。

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

2 个答案:

答案 0 :(得分:1)

看看ReadSubtree方法,它会做你想要的。实际上,它定位到结束元素节点,但它完成了你想要的。通常,你会写一些类似的东西:

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

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

如果ReadSubtree抛出异常,那当然是不可恢复的。这表明XML中的错误,我已经能够确定,使用XmlReader无法可靠地恢复。

答案 1 :(得分: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();
}