2009-06-03 3 views
4

Ich versuche, eine Proxy-Klasse mit WCF zu generieren, die, wenn serialisiert, konvertiert und Instanz der Klasse unten in das XML unten.Wie mehrere XML-Namespaces auf die gleiche Klasse mit dem XML-Serializer anwenden

Wenn ich jedoch versuche, Namespaces auf die Klassen anzuwenden, werden sie falsch oder gar nicht eingefügt.

Was mache ich falsch? Wie kann ich das beheben?

Vielen Dank im Voraus.

Klassenstruktur:

[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;} 
} 

Wunsch XML-Struktur (überflüssige XML getrimmt):

<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

(antwortete Kommentar) –

Antwort

7

Wenn Sie sprechen (xml) Attribute (dh <foo bar="abc"/>), dann sprichst du nicht über DataContractSerializer - also bleib vielleicht bei der XmlType etc ... s omething wie:

[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;} 
} 

das muss nicht die Aliase - aber es scheint korrekt zu sein, zumindest ...

Merge die Attribute oben mit „Schutz“ 's XmlSerializerNamespaces Code und es sollte sein dort ...

(Kredit hier "Garde", aber dieses Wiki ist sowieso ...)

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, habe ich diese in meinen vielen Tests ausprobiert und die wahrscheinlich lem ist, dass der Dienst, den ich Nachrichten sende explizit die x1 und x2 Aliasnamen und Fehler, wenn es sie nicht findet. –

+0

@Marc: Ich wollte eine Antwort hinzufügen, die klarstellt, dass [Xml] Attribute! = [DataContract], aber es wäre besser, wenn Sie Ihre richtige Antwort bearbeiten würden, um dies zu sagen. –

+0

@Dan: Sie sollten sich bei den Erstellern dieses Dienstes beschweren, dass sie gegen die XML-Standards verstoßen. Präfixe spielen in XML keine Rolle. –

Verwandte Themen