2009-10-08 6 views
0

J'essaie de créer une classe sérialisable mais je souhaite mapper un élément de second niveau à ma propriété de classe. Quelle est la meilleure façon de le faire.C# sérialiser l'élément de second niveau à la propriété

Exemple xml & classe

<SearchResult> 
<Head> 
    <Title q="test">My search Result</Title> 
</Head> 
<Results> 
    <Result>...</Result> 
    <Result>...</Result> 
    <Result>...</Result> 
</Results> 
</SearchResult> 

[Serializable] 
[XmlRoot(ElementName = "GSP")] 
public class SearchResult 
{ 
    **[XmlElement([email protected]"Head\Title")]** 
    public string Title { get; set; } 

    [XmlArray(ElementName = "Results")] 
    [XmlArrayItem(ElementName = "Result")] 
    public List<ResultItem> mySearchResultItems { get; set; } 


} 

[Serializable] 
public class ResultItem 
{ 
... 
} 

Ainsi, Dans mon exemple, je voudrais bien la carte à titre <Head><Title> valeur de texte en XML

Merci pour votre aide !!

Répondre

4

Vous ne pouvez pas faire cela. Vous devez créer une autre classe pour l'élément <Head>

[XmlRoot(ElementName = "GSP")] 
public class SearchResult 
{ 
    [XmlElement(ElementName = "Head")] 
    public Head Head { get; set; } 

    [XmlArray(ElementName = "Results")] 
    [XmlArrayItem(ElementName = "Result")] 
    public List<ResultItem> mySearchResultItems { get; set; } 


} 

public class Head 
{ 
    [XmlElement(ElementName = "Title")] 
    public string Title { get; set; } 
} 

public class ResultItem 
{ 
... 
} 

En outre, si l'élément titularité doit avoir un attribut, vous devrez également créer une nouvelle classe pour l'élément Titre ...

Par Ainsi, l'attribut [Serializable] n'a rien à voir avec la sérialisation XML ...

+0

Salut Thomas, j'avais peur que tu dirais ça. Comment est-ce que je ferais le code de sérialisation fait sur commande au lieu de créer le niveau plus profond des classes (que je n'ai franchement pas besoin)? – Jay

+0

Vous pouvez implémenter l'interface IXmlSerializable, il vous donnera un contrôle total sur la sérialisation. Mais cela peut être une tâche fastidieuse ... –

-1

Vous n'avez pas besoin de sérialisation personnalisée. Thomas Levesque a raison, mais vous pouvez obtenir ce que vous voulez en utilisant la même approche que vous avez utilisée pour les résultats.

Exemple:

[XmlRoot(ElementName = "GSP")] 
    public class SearchResult 
    { 
     //public string Title { get; set; } 
     [XmlArray(ElementName = "Header")] 
     [XmlArrayItem(ElementName = "Title")] 
     public List<String> myHeaderItems { get; set; } 

     [XmlArray(ElementName = "Results")] 
     [XmlArrayItem(ElementName = "Result")] 
     public List<ResultItem> mySearchResultItems { get; set; } 

     public SearchResult() 
     { 
      myHeaderItems = new List<String>(); 
      mySearchResultItems= new List<ResultItem>(); 
     } 

     public SearchResult(string title) : this() 
     { 
      myHeaderItems.Add(title); 
     } 
    } 

    public class ResultItem 
    { 
     [XmlText] 
     public String Flavor; 
    } 


    public void Run() 
    { 
     SearchResult sr = new SearchResult("Search1"); 
     sr.mySearchResultItems.Add(new ResultItem() {Flavor = "one" }) ; 
     sr.mySearchResultItems.Add(new ResultItem() {Flavor = "two" }) ; 

     var s1 = new XmlSerializer(typeof(SearchResult)); 

     Console.WriteLine("Serialized:\n{0}", s1.SerializeToString(sr)); 
    } 

produit cette sortie:

<GSP> 
    <Header> 
    <Title>Search1</Title> 
    </Header> 
    <Results> 
    <Result>one</Result> 
    <Result>two</Result> 
    </Results> 
</GSP> 
Questions connexes