2009-06-03 9 views
4

J'essaie de générer une classe proxy avec WCF qui, lors de la sérialisation, convertit et instance de la classe ci-dessous dans le XML ci-dessous. Toutefois, lorsque j'essaie d'appliquer des espaces de noms aux classes, elles ne sont pas insérées correctement ou pas du tout.Comment appliquer plusieurs espaces de noms XML à la même classe avec le sérialiseur XML

Qu'est-ce que je fais mal? Comment puis-je réparer cela?

Merci beaucoup à l'avance.

Classe Structure:

[XmlRoot] 
public class Request 
{ 
    public int Id 

    public Name Name {get;set;} 
} 

[XmlRoot] 
public class Name 
{ 
    [XmlAttribute] 
    public bool test {get;set;} 

    public string FirstName {get;set;} 

    public string LastName {get;set;} 
} 

structure XML souhaité (XML superflu rognée):

<x1:Request xmlns:x1="Data/Main" xmlns:x2="Data/All"> 
    <x2:Id>0</x2:Id> 
    <x2:Name test="true"> 
    <x2:FirstName>Dan</x2:FirstName> 
    <x2:LastName>Atkinson</x2:LastName> 
    </x2:Name> 
</x1:Request> 
+0

(répondu à un commentaire) –

Répondre

7

Si vous parlez (xml) attributs (c.-à-<foo bar="abc"/>), alors vous ne parlez pas de DataContractSerializer - alors peut-être s'en tenir à la XmlType etc ... s lya quelque chose comme:

[XmlRoot(Namespace="Data/Main")] 
public class Request { 
    [XmlElement(Namespace = "Data/All")] 
    public int Id { get; set; } 
    [XmlElement(Namespace="Data/All")] 
    public Name Name {get;set;} 
} 

[XmlType(Namespace="Data/All")] 
public class Name { 
    [XmlAttribute("test")] 
    public bool Test {get;set;} 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

qui ne possède pas les alias - mais il semble être correct, au moins ...

Fusionner les attributs ci-dessus avec « Garde » Code de XmlSerializerNamespaces et il devrait être il ...

(crédit ici pour « Garde », mais c'est wiki quand même ...)

Request req = new Request { 
     Id = 0, Name = new Name { 
      Test = true, FirstName = "Dan", LastName = "Atkinson" 
     } 
    }; 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("x1", "Data/Main"); 
    ns.Add("x2", "Data/All"); 
    new XmlSerializer(req.GetType()).Serialize(Console.Out, req,ns); 
+0

Mark, je l'ai essayé un dans mes nombreux tests et prob lem est que le service que j'envoie des messages requiert explicitement les alias x1 et x2, et des erreurs s'il ne les trouve pas. –

+0

@Marc: J'allais ajouter une réponse clarifiant que [Xml] Attributes! = [DataContract], mais il serait préférable que vous éditiez votre bonne réponse pour le dire. –

+0

@Dan: Vous devez vous plaindre auprès des créateurs de ce service qu'ils violent les normes XML. Les préfixes n'ont pas d'importance en XML. –

Questions connexes