2010-10-15 26 views
1

J'écris des classes qui (dé) sérialisent vers/depuis XML. Lors de la sérialisation et de la désérialisation, la classe obtient un XPathNavigator pour obtenir des données à partir de/ajouter des données.Ajout et manipulation de plusieurs nœuds enfants à l'aide de XPathNavigator en C#

Parce que la classe peut contenir des objets qui doivent être sérialisé trop (en utilisant le même mécanisme), je ne le suit pour ajouter un élément enfant pour chaque objet:

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(); 
    } 

} 

Surtout le MoveToParent/Déplacer vers la dernière partie de l'enfant semble être terriblement fausse (bien que cela fonctionne). Y a-t-il une meilleure manière de faire cela?

Une autre approche que je l'utilise (pour éviter que les objets avoir accès à des informations stockées à ce jour) est la suivante:

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); 
} 

Les deux approches semblent être en quelque sorte circonstancielle, car les deux créent beaucoup de frais généraux. J'apprécierais n'importe quelles idées ou astuces sur comment améliorer mon algorithme.

salutations, Dominik

+0

Avez-vous une raison particulière d'utiliser XPathNavigator en premier lieu? Cela ne semble pas particulièrement naturel. J'utiliserais 'XmlWriter' ou LINQ en XML. –

+0

Parce que j'ai commencé avec XPathNavigator pour la désérialisation et que je voulais que l'implémentation utilise le moins de classes possible. Bien que XmlWriter semble être bon pour mes fins ... – Korexio

Répondre

0

Comme Jon Skeet suggéré dans son commentaire, je l'utilise maintenant XmlReader et XmlWriter au lieu de XPathNavigator. Cela semble beaucoup plus propre;

public void Serialize(XmlWriter writer) 
{ 

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

     task.Serialize(writer); 

     writer.WriteEndElement(); 
    } 
} 

Merci!