2011-01-15 1 views
3

Je souhaite désérialiser une chaîne xml en un objet en utilisant XmlSerializer.
La chaîne xml contient noeuds inconnus supplémentaires, qui ne sont pas couverts par ma classe d'objet que je veux désérialiser. Après la désérialisation, les champs précédant le nœud inconnu sont remplis ("ast"), mais tous les champs qui le suivent ("pfosten" qui ne sont pas dans la classe d'objets) restent vides.Xml Désérialisation - après un nœud inconnu dans xml-data, tous les champs restent vides

xml-string:

<Baum> 
    <ast>1</ast> 
    <pfosten>2</pfosten> 
    <wurzel>3</wurzel> 
    <blatt>4</blatt> 
</Baum> 

-classe d'objet:

[Serializable] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public class Baum 
{ 
    public Baum() { } 
    string _ast; 
    string _wurzel; 
    string _blatt; 
    [System.Xml.Serialization.XmlElementAttribute(DataType = "NCName", Order = 0)] 
    public string ast 
    { 

     get { return _ast; } 

     set { _ast = value; } 

    } 
    [System.Xml.Serialization.XmlElementAttribute(DataType = "NCName", Order = 1)] 
    public string wurzel 
    { 

     get { return _wurzel; } 

     set { _wurzel = value; } 

    } 
    [System.Xml.Serialization.XmlElementAttribute(DataType = "NCName", Order = 2)] 
    public string blatt 
    { 

     get { return _blatt; } 

     set { _blatt = value; } 

    } 
} 

mon code ressemble à ça:

private object DeserializeString(Type t, string s) 
{ 
    object obj; 
    XmlSerializer serializer = new XmlSerializer(t); 
    serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode); 

    using (var reader = new StringReader(s)) 
    { 
     obj = serializer.Deserialize(reader); 
    } 
    return (obj); 
} 
private void serializer_UnknownNode(object sender, XmlNodeEventArgs e) 
{ 
    Debug.WriteLine("UnknownNode Name: {0}", e.Name); 
} 

Au cours de débogage je peux voir, que le serializer_UnknownNode() La méthode est appelée "pfosten" et aussi pour chaque nœud suivant.

Je programme contre .Net 2.0.

Espérons que j'ai fourni toutes les informations et que quelqu'un peut m'aider avec ceci!
merci beaucoup, moine

Répondre

2

L'ordre d'évaluation est-il pertinent?

Sinon, supprimez le paramètre Order de la XmlElementAttribute sur toutes les propriétés, et il désérialiser bien, i.e. .:

[System.Xml.Serialization.XmlElementAttribute(DataType = "NCName")] 
public string blatt 
{ 

    get { return _blatt; } 

    set { _blatt = value; } 

} 
+0

Exactement! S'il existe un noeud inconnu, il déplace tous les éléments suivants d'une position et XmlSerializer ne les reconnaît plus car ils ne sont pas à la position attendue. +1 –

+0

merci beaucoup! les attributs ont été définis par xsd2code-plugin et je n'y ai jamais pensé! est totalement logique. (Je voudrais vous voter, mais je ne peux pas) – hc2p

Questions connexes