使用XPath实现IXmlSerializable ReadXml()的最佳方法

我正在实现IXmlSerializable的ReadXml()方法,我认为使用XPath可能是最好的方法。

但是,ReadXml()需要正确处理读者位置。

因为我的WriteXml()产生了这样的东西:

 2 2  

是否有比下面(这种可怕的方式)更好的方法来确保读者之后的正确定位?

 public override void ReadXml(System.Xml.XmlReader reader) { reader.Read(); /* Read Opening tag */ /* Using reader.ReadStartElement("ObjectName") reads forward a node, ie current node becomes the first  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 */ } } 

我怀疑如果经常使用这种方法,你可能会遇到一些性能问题。 由于你的xml相对简单,我强烈怀疑你直接使用XmlReader会做得更好……

……但这样做并不容易; IMO,最好尽量避免实现IXmlSerializable (juts使用常规集合属性等) – 这是导致错误和挫折的常见原因。