【问题标题】:Best way to implement IXmlSerializable ReadXml() using XPath使用 XPath 实现 IXmlSerializable ReadXml() 的最佳方法
【发布时间】:2010-10-28 03:06:16
【问题描述】:

我正在实现 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 */
    }
}

【问题讨论】:

    标签: c# .net xml xml-serialization


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的建议。我最初使用 XmlReader,代码不是特别清晰,看起来不能很好地处理错误。性能在这里不是一个大问题,我想我也想了解一下正在发生的事情。
    • 我应该提一下,我的例子也很清楚——我必须为一系列大约 20 个不同程度的 XML 复杂性的类做这个。
    • 这可能是不使用 IMO IXmlSerializable 的更多理由。一次做对是一项使命; 20次是英雄。考虑使用镜像 xml 结构的简单 DTO 类,并使用常规 C# 在 DTO 类和您的对象模型之间进行转换。
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2010-09-21
    • 2010-10-13
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多