2013-10-21 115 views
0

我試圖將數據發佈到只接受XML的Web應用程序。我已經創建了C#中的對象(如下),並正在使用XmlSerializer序列化對象到XML,但不能工作如何結構,以獲得接收應用程序需要生成的XML對象:XML對象序列化

的REQUIRED生成的XML

<recipients> 
    <gsm messageId="clientmsgID1">number1</gsm> 
    <gsm messageId="clientmsgID2">number2</gsm> 
    <gsm messageId="clientmsgID3">number3</gsm> 
    <gsm messageId="clientmsgID4">number4</gsm> 
</recipients> 

我的對象

public class recipients 
{ 
    public List<gsm> gsm{ get; set; } 

    public recipients() 
    { 
     gsm = new List<gsm>(); 
    } 
} 

public class gsm 
{ 
    [XmlText] 
    public string number { get; set; } 

    [XmlAttribute] 
    public string messageId{ get; set; } 
} 

我的結果ing XML

<recipients> 
    <gsm> 
     <gsm messageId="clientmsgID1">number1</gsm> 
    </gsm> 
</recipients> 
+0

你的xml文件現在是如何構成的? – Vincent

+0

我將使用當前結果更新問題。 – Jimbo

回答

3

使用xsd.exe並嘗試傳遞上面顯示的xml文件。這將創建一個xsd文件,使用這個xsd創建一個cs類,然後在你的應用程序中使用這個cs類,它將在序列化過程中創建相同的XMl,例如

C:> xsd gsm.xml其中gsm.xml將你在上面
粘貼的XML標記,然後
C:> XSD gsm.xsd/C產生CS類

using System.Xml.Serialization; 

public partial class recipients { 
    private recipientsGsm[] itemsField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("gsm", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] 
    public recipientsGsm[] Items { 
    get { return this.itemsField; } 
    set { this.itemsField = value; } 
    } 
} 


public partial class recipientsGsm { 
    private string messageIdField; 
    private string valueField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string messageId { 
    get { return this.messageIdField; } 
    set { this.messageIdField = value; } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlTextAttribute()] 
    public string Value { 
    get { return this.valueField; } 
    set { this.valueField = value; } 
    } 
} 
+0

對不起,我是新來的。代碼塊(類名稱聲明行)的某些部分呈現爲簡單文本 – Sarvesh

2

你只需要添加

[System.Xml.Serialization.XmlElementAttribute("gsm", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] 

在CL屁股收件人

public class recipients 
{ 
    [System.Xml.Serialization.XmlElementAttribute("gsm", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] 
    public List<gsm> gsm{ get; set; } 

    public recipients() 
    { 
     gsm = new List<gsm>(); 
    } 
} 

,它應該工作

+0

在設法修復我的解決方案之前,我沒有機會測試它(如上所述) - 這是一個很好的修復方法它在將來如此謝謝。 – Jimbo

1

您可以標記你的財產GSM與屬性[的XmlElement( 「GSM」)

類的完整清單:

public class recipients 
{ 
    [XmlElement("gsm")] 
    public List<gsm> gsm { get; set; } 

    public recipients() 
    { 
     gsm = new List<gsm>(); 
    } 
} 

public class gsm 
{ 
    [XmlText] 
    public string number { get; set; } 

    [XmlAttribute] 
    public string messageId { get; set; } 
} 

示例代碼:

012從我的應用程序
var a = new recipients(); 
a.gsm.Add(new gsm() { messageId = "1", number = "aaa" }); 
a.gsm.Add(new gsm() { messageId = "2", number = "bbb" }); 
XmlSerializer serializer = new XmlSerializer(typeof(recipients)); 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("", ""); 
serializer.Serialize(Console.Out, a, ns); 

輸出:

<?xml version="1.0"?> 
<recipients> 
    <gsm messageId="1">aaa</gsm> 
    <gsm messageId="2">bbb</gsm> 
</recipients> 
0

解決

我想管理的其他一些建議之前解決這個問題我自己,我想我應該在這裏發表修復反正。

我做了recipients實施List<gsm>。完成:)

public class recipients: List<gsm> 
{ 
    private List<gsm> gsms{ get; set; } 

    public recipients() 
    { 
     gsms = new List<gsm>(); 
    } 

    public IEnumerator<gsm> GetEnumerator() 
    { 
     return gsms.GetEnumerator(); 
    } 
} 

public class gsm 
{ 
    [XmlText] 
    public string number { get; set; } 

    [XmlAttribute] 
    public string messageId { get; set; } 
} 
+0

這真的很危險,除非你重載了所有的方法,否則它不會像'List '那樣行事。 Ex'recipients.Add(new gsm())'將添加一個未由'recipients.GetEnumerator()'枚舉的元素。 – flindeberg