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

时间:2009-05-22 03:20:45

标签: c# .net xml xml-serialization

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

但是,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 */
    }
}

1 个答案:

答案 0 :(得分:2)

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

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