2009-03-27 6 views
1

j'ai une classe qui aComment puis-je sérialiser une classe avec un attribut

[XmlRoot] 
<snip> 

[XmlAttribute(AttributeName="x:uid")] 
public string uid; 

<snip> 

Il est OK Au moment de la compilation .. Cependant lors de l'exécution, exception se produit à la ligne

XmlSerializer serializer = new XmlSerializer(typeof(myClass)); 

parce que du caractère non valide dans « x: uid » .. l'élément dans ma classe a besoin d'avoir un « x: uid » attribut à des fins de localisation .. Comment puis-je faire ??

Merci!

Répondre

0

Pour autant que je sache, vous ne pouvez pas utiliser le préfixe d'espace de noms dans le répertoire C# déclaration d'attribut XML. Essayez simplement "uid" sans "x:"

+0

attributs XML * peut * avoir namespaces . –

+0

Oui, vous avez raison ... mon erreur –

8

Pour définir l'espace de nom de l'attribut, vous devez utiliser la propriété Namespace de XmlAttributeAttribute.

S'il est particulièrement important que le préfixe utilisé pour cet espace de noms soit "x", vous pouvez le contrôler en utilisant la classe XmlSerializerNamespaces lors de la sérialisation, en option avec XmlNamespaceDeclarationsAttribute.


Voici un exemple de travail:

[XmlRoot(Namespace = "http://foo")] 
public class MyClass 
{ 
    private XmlSerializerNamespaces xmlns; 

    [XmlNamespaceDeclarations] 
    public XmlSerializerNamespaces Xmlns 
    { 
     get 
     { 
      if (xmlns == null) 
      { 
       xmlns = new XmlSerializerNamespaces(); 
       xmlns.Add("x", "http://xxx"); 
      } 
      return xmlns; 
     } 
     set { xmlns = value; } 
    } 

    [XmlAttribute("uid", Namespace = "http://xxx")] 
    public int Uid { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var s = new XmlSerializer(typeof(MyClass)); 
     s.Serialize(Console.Out, new MyClass { Uid = 123 }); 
     Console.ReadLine(); 
    } 
} 

qui produit:

<?xml version="1.0" encoding="ibm850"?> 
<MyClass 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:x="http://xxx" 
    x:uid="123" 
    xmlns="http://foo"/> 
5

Vous devez spécifier l'espace de noms réel - et non l'alias (que l'auteur décidera):

[XmlAttribute(AttributeName="uid", Namespace="http://my/full/namespace")] 
public string uid; 

Notez que i t est courant d'utiliser un « const string » pour les espaces de noms, etc. De plus, les champs publics pas une bonne idée - avec 3,0 C# vous pourriez avoir (xml attributs non représenté):

public string Uid {get;set;} 
Questions connexes