Лучший способ реализовать IXmlSerializable ReadXml () с использованием XPath

2

Я использую метод ReadXml() для IXmlSerializable, и я полагаю, что использование XPath, вероятно, самый приятный способ сделать это.

Однако ReadXml() должен правильно обрабатывать позицию читателя.

Итак, учитывая, что мой WriteXml() создает что-то вроде этого:

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

Есть ли лучший способ, чем (этот ужасный способ) ниже, чтобы обеспечить правильное позиционирование Reader?

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 */
    }
}
Теги:
xml-serialization

1 ответ

2
Лучший ответ

Я подозреваю, что вы можете столкнуться с некоторыми проблемами производительности при регулярном использовании этого подхода. Поскольку ваш xml относительно прост, я сильно подозреваю, что вам лучше просто использовать XmlReader напрямую...

... но делать это непросто; IMO, лучше попытаться избежать необходимости реализации IXmlSerializable (juts с использованием обычных свойств коллекции и т.д.) - это общая причина ошибок и разочарований.

  • 0
    Спасибо за совет. Первоначально я использовал XmlReader, и код не был особенно понятным и не выглядел так, как будто он хорошо справлялся с ошибками. Производительность здесь не является серьезной проблемой, и я думаю, я бы тоже хотел обдумать, что происходит.
  • 0
    Я должен упомянуть, что мой пример тоже очищен - я должен сделать это для серии из примерно 20 классов различной степени сложности XML.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню