2010-08-18 3 views
3

Je veux créer une structure comme:Noms de types d'éléments polymorphes utilisant XmlInclude ..?

<root> 
<items> 
    <myns:a s="a"/> 
    <b s="a"/> 
</items> 
</root> 

Lorsque les éléments de racine sont descendant d'une classe de base commune. Je ne peux tout simplement pas le faire fonctionner. L'extrait suivant crée

<root> 
<items> 
    <Base xsi:type="A" s="a"/> 
    <Base xsi:type="B" s="a"/> 
</items> 
</root> 

[Serializable] 
[XmlInclude(typeof(A))] 
[XmlInclude(typeof(B))] 
public class Base 
{ 
} 

[Serializable] 
public class A : Base 
{ 
    public string a = "a"; 
} 

[Serializable] 
public class B : Base 
{ 
    public string b = "b"; 
} 

[Serializable] 
public class Root 
{ 
    public List<Base> items = new List<Base>(); 
} 

Si j'utilise l'attribut XmlType, je peux changer le xsi: nom du type, mais pas le nom de balise. Je souhaite également utiliser un espace de noms personnalisé sur l'une des balises, mais si j'ajoute un espace de nom à XmlType, un message d'erreur s'affiche indiquant que le type est introuvable et XmlInclude doit être ajouté ..

c'est en fait assez simple, je ne pouvais pas savoir comment ..

Répondre

9

Vous cherchez XmlArrayItemAttribute?

[Serializable] 
public class Root 
{ 
    [XmlArrayItem("a", typeof(A), Namespace = "myns")] 
    [XmlArrayItem("b", typeof(B))] 
    public List<Base> items = new List<Base>(); 
} 

Cela sérialisation comme:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <items> 
    <a xmlns="myns"> 
     <a>a</a> 
    </a> 
    <b> 
     <b>b</b> 
    </b> 
    </items> 
</Root> 

Vous pouvez également utiliser XmlElementAttribute si vous souhaitez que les éléments d'être des enfants directs de la racine au lieu d'avoir un élément pour les éléments.

+0

Nice! Je ne savais pas que j'utilise plusieurs XmlArrayItem. Cela m'a également permis de supprimer le XmlInclude de la classe de base. Merci! – simendsjo

+0

n'était pas au courant de cet attribut, merci! –

+0

C'était exactement ce que je cherchais! – coldandtired

Questions connexes