2009-04-08 16 views
1

Die XmlSerializer macht alles was ich will mit einer Ausnahme. Ich muss ein Element mit einem anderen Element als ein Attribut dieses Elements paaren. Ich möchte keine vollständig benutzerdefinierte Serialisierungsmethode schreiben. Hier ist meine Klasse:Xmlserializer - Kontrollelement-Attribut Paarung (überarbeitet)

public class Transaction 
{ 
    [XmlElement("ID")] 
    public int m_id; 

    [XmlElement("TransactionType")] 
    public string m_transactiontype; 

    [XmlAttribute("TransactionTypeCode")] 
    public string m_transactiontypecode; 
} 

Ich Instanziieren und serialisieren wie folgt;

Transaction tx = new Transaction(); 

    tx.m_id = 1; 
    tx.m_transactiontype = "Withdrawal"; 
    tx.m_transactiontypecode = "520"; 

    StringWriter o = new 
    StringWriter(CultureInfo.InvariantCulture); 
    XmlSerializer s = new 
    XmlSerializer(typeof(Transaction)); 
    s.Serialize(o, tx); 
    Console.Write(o.ToString()); 

Gibt mir:

<Transaction TransactionTypeCode="520"> 
    <ID>1</ID> 
    <TransactionType>Withdrawal</TransactionType> 
    </Transaction> 

Ich möchte:

<Transaction> 
    <ID>1</ID> 
    <TransactionType TransactionTypeCode="520">Withdrawal</TransactionType> 
    </Transaction> 

Jemand (Chris Dogget) vorgeschlagen:

public class Transaction 
    { 

     [XmlElement("ID")] 
     public int m_id; 

     public TransactionType m_transactiontype; 
    } 

    public class TransactionType 
    { 
     public TransactionType(){} 
     public TransactionType(string type) { this.m_transactiontype = type; } 

     [XmlTextAttribute] 
     public string m_transactiontype; 

     [XmlAttribute("TransactionTypeCode")] 
     public string m_transactiontypecode; 
    } 

Die Verwendung der Transaction Klasse sieht vielversprechend aus - kannst du mir zeigen, wie es dir geht? d instanziieren die Klassen vor der Serialisierung?

Danke!

+0

Mind Tagging welche Programmiersprache diese Frage in Bezug auf ist? – Calvin

+0

Wenn Sie die Frage optimieren müssen, dann optimieren Sie die Frage; Erstelle kein neues. Zusammengeführt. –

Antwort

0

Ich denke, Sie sollten eine separate Klasse mit Type und TypeCode Felder erstellen. Dekorieren Sie TypeCode mit [XmlAttribute] und Typ mit [XmlText]. diese

2
public class Transaction 
{ 

    [XmlElement("ID")] 
    public int m_id; 

    public TransactionType type; 
} 

public class TransactionType 
{ 
    public TransactionType(){} 
    public TransactionType(string type) { [email protected] = type; } 

    [XmlTextAttribute] 
    public string @Type; 

    [XmlAttribute("TypeCode")] 
    public string typecode; 
} 

gibt mir:

<?xml version="1.0" encoding="utf-16"?> 
<Transaction xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ID>1</ID> 
    <type TypeCode="520">Withdrawal</type> 
</Transaction> 

Leider "Typ" ist ein tatsächlicher Typ in .NET, so dass Sie nicht wirklich, dass (Groß- mindestens) als Feldnamen verwenden können.

+0

> "" Typ“ist ein tatsächlicher Typ in .NET, so dass Sie kann das nicht wirklich benutzen "- Sicher kannst du: Es wird in einem anderen Namensraum sein, also werden die Dinge gut funktionieren. Wie für Mitglieder, die anderen Keywords entsprechen, können Sie sie einfach mit einem @ –

1

Ich glaube, der einzige Weg, dies zu tun ist, eine Klasse von Typ (schlechter Name obwohl, da es ein Schlüsselwort im Rahmen ist auch ...) mit Member-Eigenschaft TypeCode zu erstellen. Dann haben Sie eine Typ-Instanz oder Referenz als Teil der Klasse Transaction.

0

Implementieren Sie IXmlSerializable und verwenden Sie Linq to XML to construct your serialized object.

Auf diese Weise können Sie genau steuern, wie Ihre XML aussieht.

Persönlich würde ich XmlSerialization fallen lassen, gehen Sie mit XAML und vergessen Sie zu versuchen, meine XML sieht. Es kann wie Mist aussehen, solange es funktioniert!

0

Ihr gewünschter XML-Code stimmt nicht mit der Anordnung Ihrer Objekte in Ihrem Code überein.

Wenn Sie die XML lesen Sie sagen, die folgende ...

Die Transaktion zwei Elemente enthält: ID und Typ. Typ hat ein Attribut namens TypeCode

Wenn Sie sich das Objekt ansehen, das Sie erstellen möchten, sagen Sie dies ...

Die Transaktion enthält drei Eigenschaften: ID, Typ und Typecode

... Sie die Trennung zwischen den beiden sehen. Sie müssen die Ziele von jedem ausrichten, um richtige Serialisierung zu erhalten (ändern Sie entweder die Klasse oder das XML, so dass die beiden ausrichten, was Sie zu kommunizieren versuchen).

0

OK, lassen Sie uns das entfernen " 'Typ' ist eine Art in .NET" -Ausgabe (mein schlecht):

public class Transaction 
    { 
     [XmlElement("ID")] 
     public int m_id; 

     [XmlElement("TransactionType")] 
     public string m_transactiontype; 

     [XmlAttribute("TransactionTypeCode")] 
     public string m_transactiontypecode; 
    } 

I instanziiert und Serialisierung wie folgt;

Transaction tx = new Transaction(); 

    tx.m_id = 1; 
    tx.m_transactiontype = "Withdrawal"; 
    tx.m_transactiontypecode = "520"; 

    StringWriter o = new StringWriter(CultureInfo.InvariantCulture); 
    XmlSerializer s = new XmlSerializer(typeof(Transaction)); 
    s.Serialize(o, tx); 
    Console.Write(o.ToString()); 

Gibt mir:

<Transaction TransactionTypeCode="520"> 
    <ID>1</ID> 
    <TransactionType>Withdrawal</TransactionType> 
</Transaction> 

Ich möchte:

<Transaction> 
    <ID>1</ID> 
    <TransactionType TransactionTypeCode="520">Withdrawal</TransactionType> 
</Transaction> 

Die Verwendung der Transaction Klasse sieht vielversprechend aus - können Sie mir zeigen, wie Sie die Klassen vor Serialisierung instanziiert würde?

Danke!

+0

vorveröffentlichen GD vermasselt meine Post - eine neue Frage posten ... –

1

Unter der Annahme, diesen Code für Ihre Typen:

public class Transaction 
{ 
    public Transaction() { ttype = new TransactionType(); } 

    [XmlElement("ID")] 
    public int id; 

    [XmlElement("TransactionType")] 
    public TransactionType ttype; 
} 

public class TransactionType 
{ 
    public TransactionType(){} 
    public TransactionType(string txType) { this.type = txType; } 

    [XmlText] 
    public string type; 

    [XmlAttribute("TransactionTypeCode")] 
    public string typecode; 
} 

Dieser Code wird initialisiert und serialisiert wird, wie Sie wollen:

public void Run() 
{ 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 

    Transaction tx = new Transaction(); 
    tx.id = 1; 
    tx.ttype.type = "Withdrawal"; 
    tx.ttype.typecode = "520"; 
    using (StringWriter o = 
      new StringWriter(CultureInfo.InvariantCulture)) 
    { 
     XmlSerializer s = new XmlSerializer(typeof(Transaction)); 
     s.Serialize(o, tx, ns); 
     Console.Write(o.ToString()); 
    } 
}