我正在使用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块确保光标前进到*。 (注意。下一个元素并不总是称为'签名')。
我发现这很难解释。请问是否需要澄清,我可以举出更多例子。
答案 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();
}