2010-10-15 4 views
1

Я пишу классы, которые (де) сериализуют в/из XML. При сериализации и десериализации класс получает XPathNavigator для получения данных из/добавления данных.Добавление и управление несколькими дочерними узлами с использованием XPathNavigator в C#

Поскольку класс может содержать объекты, которые должны быть сериализовать тоже (используя тот же механизм), я следующий, чтобы добавить дочерний элемент для каждого объекта:

public void Serialize(XPathNavigator navigator) 
{ 

    foreach(IXmlSerializableObject o in objects) { 

     // Create child element. 
     navigator.AppendChildElement(string.Empty, "child", string.Empty, null); 

     // Move to last child element. 
     navigator.MoveToChild(XPathNodeType.Element); 
     while (navigator.MoveToNext(XPathNodeType.Element)) ; 

     // Serialize the object at the current node. 
     // This will add attributes and child elements as required. 
     // The navigator will be positiononed at the same node after the call. 
     o.Serialize(navigator); 

     navigator.MoveToParent(); 
    } 

} 

в особенности MoveToParent/Переместить Последняя часть ребенка кажется ужасно неправильной (хотя она работает). Есть лучший способ сделать это?

Другой подход я использую (чтобы избежать этого объекты получить доступ к информации, хранящейся до сих пор) заключается в следующем:

foreach(IXmlSerializableObject o in objects) { 
{ 

    // Create a new (empty) document for object serialization. 
    XPathNavigator instructionNavigator = new XmlDocument().CreateNavigator(); 
    instructionNavigator.AppendChildElement(string.Empty, "child", string.Empty, null); 
    instructionNavigator.MoveToChild(XPathNodeType.Element); 

    // Serialize the object. 
    o.Serialize(instructionNavigator); 

    // Now add the serialized content to the navigator. 
    instructionNavigator.MoveToRoot(); 
    instructionNavigator.MoveToChild(XPathNodeType.Element); 
    navigator.AppendChild(instructionNavigator); 
} 

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

поздравления, Dominik

+0

Есть ли у вас какие-либо причины использовать XPathNavigator? Это не кажется особенно естественным. Я бы использовал 'XmlWriter' или LINQ to XML. –

+0

Поскольку я начал с XPathNavigator для десериализации и хотел, чтобы реализация использовала как можно меньше классов. Хотя XmlWriter отлично подходит для моих целей ... – Korexio

ответ

0

Как Джон Скит, предложенные в своем комментарии, я теперь использовать XmlReader и XmlWriter вместо XPathNavigator. Это кажется намного более чистым;

public void Serialize(XmlWriter writer) 
{ 

    foreach (Instruction task in this.Tasks) 
    { 
     writer.WriteStartElement(task.Tag); 

     task.Serialize(writer); 

     writer.WriteEndElement(); 
    } 
} 

Спасибо!

 Смежные вопросы

  • Нет связанных вопросов^_^