2009-04-08 2 views
1

XmlSerializer делает все, что я хочу с одним исключением. Мне нужно связать элемент с другим элементом как атрибут этого элемента. Я не хочу писать полностью настраиваемый метод сериализации. Вот мой класс:XMLSerializer - Элемент управления-Атрибут Сопряжение (пересмотренная)

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

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

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

Я создаю и сериализую следующим образом;

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()); 

дает мне:

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

Я хочу:

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

Кто-то (Chris Dogget) предложил:

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

Использование класса TransactionType выглядит многообещающим - вы можете показать мне, как вы d создавать классы перед сериализацией?

Спасибо!

+0

Умение пометить, на каком языке программирования этот вопрос касается? – Calvin

+0

Если вам нужно настроить вопрос, а затем настроить вопрос; не создавайте новую. Объединенное. –

ответ

0

Я думаю, вы должны создать отдельный класс с типом и TypeCode полей. Украсьте TypeCode с помощью [XmlAttribute] и введите с помощью [XmlText].

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

дает мне это:

<?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> 

К сожалению, «Тип» является фактическим типом в .NET, так что вы не можете реально использовать, что (по крайней мере в верхнем регистре) в качестве имени поля.

+0

> «» Тип»является фактический тип в .NET, так что вы не может действительно использовать это »- Конечно, вы можете: он будет в другом пространстве имен, так что все будет хорошо. Что касается участников, которые соответствуют другим ключевым словам, вы можете просто предисловие к ним с помощью @ –

1

Я считаю, что единственный способ сделать это, чтобы создать класс типа (плохое имя, хотя, учитывая, что это ключевое слово в рамках, а также ...) со свойством член TypeCode. Затем у вас есть экземпляр Type или ссылка как часть класса Transaction.

0

Реализовать IXmlSerializable и использовать Linq to XML to construct your serialized object.

Таким образом вы можете точно контролировать, как выглядит ваш xml.

Лично я бы отбросил XmlSerialization, пойдите с XAML и забудьте о попытке получить мой XML выглядит. Он может выглядеть как дерьмо, если он работает!

0

Ваш желаемый XML не совпадает с тем, как вы выложив свои объекты в вашем коде.

Если вы читали XML вы говорите следующее ...

Транзакция состоит из двух элементов: идентификатор и тип. Тип имеет атрибут под названием TypeCode

Если вы посмотрите на объект, который вы пытаетесь создать, вы говорите это ...

Сделка содержит три свойства: ID, тип и TypeCode

... вы можете увидеть разрыв между ними. Вы должны согласовать цели каждого, чтобы получить правильную сериализацию (измените либо класс, либо xml, чтобы они соответствовали тому, что вы пытаетесь установить).

0

ОК, давайте удалить «„тип“тип в .NET» вопрос (мой плохой):

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

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

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

I экземпляр и сериализации следующим образом;

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()); 

дает мне:

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

Я хочу:

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

Использование класса TransactionType выглядит многообещающим - вы можете показать мне, как вы бы создавать экземпляры классов, прежде чем сериализации?

Спасибо!

+0

GD напортачил мой пост - опубликовал новый вопрос ... –

1

Предполагая, что этот код для ваших типов:

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

Этот код будет инициализировать и сериализации, как вы хотите:

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()); 
    } 
} 
Смежные вопросы