2013-03-21 63 views
0

我正在使用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方法是成功的,光標被在左*。但是,如果失敗,它可能會留在results元素中的任何地方。我希望我的catch塊確保光標前進到*。 (注意下一個元素並不總是被稱爲'簽名')。

我發現這很難解釋。請問是否需要澄清,我可以舉更多例子。

+0

我覺得自己是個例外,一般不應該是方案的預期流的一部分。他們應該是有計劃的,是的,但我覺得你應該做一些檢查,以防止異常被拋在第一位。 – Gray 2013-03-21 14:01:46

+1

有什麼理由可以失敗?我會解決原因而不是症狀。 – 2013-03-21 14:04:04

回答

0

吉姆是正確的,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(); 
} 
1

看看ReadSubtree方法,它會做你想做的。實際上,它定位到最終元素節點,但它完成了你想要的。通常情況下,你寫的東西,如:

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

ReadSubtree後的回報,以reader.Read通話將返回</results>結束元素節點。所以如果處理結果拋出一個異常,你仍然是在正確的地方。

如果ReadSubtree引發異常,那當然是不可恢復的。這表明XML中的錯誤,就我所能確定的而言,使用XmlReader不能可靠地恢復。