2017-05-16 4 views
0

Ich habe diese xml von unserem Lieferanten (ein Auszug):C# - XML ​​vom Hersteller hat mehrere Elementnamen für das gleiche Objekt. Wie man sie in das gleiche Objekt serialisiert?

<Roles xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:immutable="http://www.digitalmeasures.com/schema/immutable"> 
    <immutable:Role roleKey="INDIVIDUAL-ACTIVITIES-University-DataBackupService" text="Data Backup Service"> 
     <Item xlink:type="simple" xlink:href="/login/service/v4/Role/INDIVIDUAL-ACTIVITIES-University-DataBackupService"/> 
     <Users xlink:type="simple" xlink:href="/login/service/v4/RoleUser/INDIVIDUAL-ACTIVITIES-University-DataBackupService"/> 
    </immutable:Role> 
    <Role roleKey="INDIVIDUAL-ACTIVITIES-University-DepartmentUpdatePrimaryAssignmentOrg" text="Department: Update Primary Assignment Org"> 
     <Item xlink:type="simple" xlink:href="/login/service/v4/Role/INDIVIDUAL-ACTIVITIES-University-DepartmentUpdatePrimaryAssignmentOrg"/> 
     <Users xlink:type="simple" xlink:href="/login/service/v4/RoleUser/INDIVIDUAL-ACTIVITIES-University-DepartmentUpdatePrimaryAssignmentOrg"/> 
    </Role> 
</Roles> 

Ich habe diese Klassen in meinem C# -Code ein:

public class Role 
{ 
    [XmlAttribute] 
    public string roleKey { get; set; } 
    [XmlAttribute] 
    public string text { get; set; } 
    [XmlAttribute] 
    public string Item { get; set; } 
    [XmlAttribute] 
    public string Users { get; set; } 
} 

//Class to hold our array of <DailyStat> 
[Serializable] 
[XmlRootAttribute("Roles")] 
//[XmlRootAttribute("immutable:Roles")] 
public class Roles 
{ 
    [XmlElement("Role")] 
    public Role[] thisRole { get; set; } 
} 

Die xml ich vom Lieferanten erhalten (über einen Web Service), hat 20 Elemente, die als Role und 6 als unveränderlich markiert sind: Role. Wenn ich meinen Code ausführe, sehe ich nur die 20 Role-Items, aber ich möchte alle 26 Items. Wie kann ich sie kaufen?

+0

Haben Sie versucht, das XML zu kopieren, gehen Sie zu Visual Studio: Bearbeiten -> Inhalte einfügen -> XML als Klassen einfügen. Und versuchen Sie, sie damit zu deserialisieren? –

+0

Nein. Ich wusste nichts davon. Ich werde es versuchen. –

+0

Ich habe das spezielle einfügen und jetzt bekomme ich Mehrdeutigkeitsfehler. Ich werde durchwühlen und sehen, ob ich sie lösen kann. –

Antwort

0

Ich poste es nur für andere Leute, ich fand diese Website, die XML in C# Objekte konvertieren wird. Ich mag die Ergebnisse besser als was Paste Special -> XML einfügen, wie Klassen mir gab. XML to c# website

1

Meine Waffe der Wahl für Klassengeneration ist xsd, ich finde es viel einfacher, Attribute wie diese zu kontrollieren, anstatt sie alleine zu produzieren, besonders in schwierigen Szenarien wie deiner. Im Grunde ist es eine Geschichte von zwei Namespaces. Identische Struktur, verschiedene Attributdekorationen. Es gibt 2 verschiedene Namespaces no und imm, um die Role Klassen zu trennen. Item und Users Knoten haben den gemeinsamen Typ CT, und no.Role und imm.Role teilen diesen Typ.

internal static class ct 
{ 
public const string nsImmutable = "http://www.digitalmeasures.com/schema/immutable"; 
public const string nsXLink = "http://www.w3.org/1999/xlink"; 
} 

[Serializable] 
[XmlType(AnonymousType = true)] 
[XmlRoot(Namespace = "", IsNullable = false)] 
public partial class Roles 
{ 
    [XmlElement("Role", typeof(no.Role))] 
    [XmlElement("Role", typeof(imm.Role), Namespace = ct.nsImmutable)] 
    public object[] Items { get; set; } 
} 

public partial class BaseRole 
{ 
    [XmlAttribute("roleKey")] 
    public string RoleKey { get; set; } 

    [XmlAttribute("text")] 
    public string Text { get; set; } 
} 

    [Serializable] 
    [XmlType(AnonymousType = true)] 
    //[XmlRoot(Namespace = "", IsNullable = false)] 
    public partial class CT 
    { 
    [XmlAttribute(Form = XmlSchemaForm.Qualified, Namespace = ct.nsXLink, AttributeName = "type")] 
    public string Type { get; set; } 

    [XmlAttribute(Form = XmlSchemaForm.Qualified, Namespace = ct.nsXLink, AttributeName = "href")] 
    public string Href { get; set; } 
    } 

namespace imm 
{ 
    [Serializable] 
    [XmlType(AnonymousType = true, Namespace = ct.nsImmutable)] 
    [XmlRoot(Namespace = ct.nsImmutable, IsNullable = false)] 
    public partial class Role : BaseRole 
    { 
    [XmlElement(Namespace = "", Type = typeof(CT), ElementName = "Item")] 
    public CT Item { get; set; } 

    [XmlElement(Namespace = "", Type = typeof(CT), ElementName = "Users")] 
    public CT Users { get; set; } 
    }  
} 


namespace no 
{ 
    [Serializable] 
    [XmlType(AnonymousType = true)] 
    public partial class Role : BaseRole 
    { 
    [XmlElement("Item", typeof(CT))] 
    public CT Item { get; set; } 

    [XmlElement("Users", typeof(CT))] 
    public CT Users { get; set; } 
    } 
} 
Verwandte Themen