2009-05-22 61 views
2

我正在實現IXmlSerializable的ReadXml()方法,而使用XPath的圖可能是最好的方法。使用XPath實現IXmlSerializable ReadXml()的最佳方法

但是,ReadXml()需要正確處理閱讀器位置。

所以給我的中WriteXML()產生這樣的:

<ObjectName> 
    <SubNode>2</SubNode> 
    <SubNode>2</SubNode> 
</ObjectName> 

難道還有比一個更好的方式(這種可怕的方式)以下,以確保閱讀器之後的位置是否正確?

public override void ReadXml(System.Xml.XmlReader reader) 
{ 
     reader.Read(); /* Read Opening tag */ 
     /* Using reader.ReadStartElement("ObjectName") reads forward a node, 
      i.e. current node becomes the first <SubNode> 
      whereas Read() doesn't even when the documentation says they both do 
     */ 
     XPathNavigator n = MakeXPathNavigator(reader.ReadSubtree()); 
     XPathNodeIterator nodes = n.Select(".//SubNode"); 
     while (nodes.MoveNext()) 
     { 
      /* Do stuff with nodes */ 
      _values.Add(nodes.Current.ValueAsInt); 
     } 
     reader.Skip(); /* Skip reader forward */ 
} 

public static XPathNavigator MakeXPathNavigator(XmlReader reader) 
{ 
    try 
    { 
     return new XPathDocument(reader).CreateNavigator(); 
    } 
    catch(XmlException e) 
    { 
     throw e; /* Maybe hide/deal with exception */ 
    } 
} 

回答

2

我懷疑你可能遇到一些性能問題,如果常規使用這種方法。由於你的xml比較簡單,我強烈懷疑你會更好地直接使用XmlReader ...

......但這樣做並不容易;國際海事組織,最好儘量避免需要實施IXmlSerializable(使用常規收集屬性等) - 這是錯誤和沮喪的常見原因。

+0

感謝您的意見。我最初使用XmlReader,代碼不是特別清楚,看起來不像它會很好地處理錯誤。在這裏表現並不是一個大問題,我想我也想把自己的頭腦也包括在內。 – 2009-05-22 04:50:56