C# XML对象序列化

C# XML对象序列化,c#,xml,serialization,xml-serialization,xmlserializer,C#,Xml,Serialization,Xml Serialization,Xmlserializer,我试图将数据发布到只接受XML的web应用程序。我已经在c#中创建了对象(如下所示),并且正在使用XmlSerializer将对象序列化为XML,但无法确定如何构造对象以获得接收应用程序所需的结果XML: 所需的结果XML <recipients> <gsm messageId="clientmsgID1">number1</gsm> <gsm messageId="clientmsgID2">number2</gsm>

我试图将数据发布到只接受XML的web应用程序。我已经在c#中创建了对象(如下所示),并且正在使用
XmlSerializer
将对象序列化为XML,但无法确定如何构造对象以获得接收应用程序所需的结果XML:

所需的结果XML

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

第一
2号
3号
4号
我的对象

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; }
}
公共类收件人
{
公共列表gsm{get;set;}
公众受助人()
{
gsm=新列表();
}
}
公共类gsm
{
[XmlText]
公共字符串编号{get;set;}
[XmlAttribute]
公共字符串messageId{get;set;}
}
我的结果XML

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

第一

使用xsd.exe并尝试传递上面显示的xml文件。这将创建一个xsd文件,使用这个xsd创建一个cs类,然后在应用程序中使用这个cs类,它将在序列化时创建相同的XMl e、 g

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; }
  }
}
使用System.Xml.Serialization;
公共部分类收件人{
私人接收人SM[]项字段;
/// 
[System.Xml.Serialization.XmlElementAttribute(“gsm”,Form=System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable=true)]
公众接受者SM[]项目{
获取{返回this.itemsField;}
设置{this.itemsField=value;}
}
}
公共部分类接受者{
私有字符串messageIdField;
私有字符串值字段;
/// 
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串消息ID{
获取{返回this.messageIdField;}
设置{this.messageIdField=value;}
}
/// 
[System.Xml.Serialization.XmlTextAttribute()]
公共字符串值{
获取{返回this.valueField;}
设置{this.valueField=value;}
}
}

使用xsd.exe并尝试传递上面显示的xml文件。这将创建一个xsd文件,使用这个xsd创建一个cs类,然后在应用程序中使用这个cs类,它将在序列化时创建相同的XMl e、 g

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; }
  }
}
使用System.Xml.Serialization;
公共部分类收件人{
私人接收人SM[]项字段;
/// 
[System.Xml.Serialization.XmlElementAttribute(“gsm”,Form=System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable=true)]
公众接受者SM[]项目{
获取{返回this.itemsField;}
设置{this.itemsField=value;}
}
}
公共部分类接受者{
私有字符串messageIdField;
私有字符串值字段;
/// 
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串消息ID{
获取{返回this.messageIdField;}
设置{this.messageIdField=value;}
}
/// 
[System.Xml.Serialization.XmlTextAttribute()]
公共字符串值{
获取{返回this.valueField;}
设置{this.valueField=value;}
}
}
您只需添加

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

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>();
    }
}
公共类收件人
{
[System.Xml.Serialization.XmlElementAttribute(“gsm”,Form=System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable=true)]
公共列表gsm{get;set;}
公众受助人()
{
gsm=新列表();
}
}
而且它应该可以工作

您只需添加

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

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>();
    }
}
公共类收件人
{
[System.Xml.Serialization.XmlElementAttribute(“gsm”,Form=System.Xml.Schema.XmlSchemaForm.Unqualified,IsNullable=true)]
公共列表gsm{get;set;}
公众受助人()
{
gsm=新列表();
}
}

而且它应该可以工作

您可以使用属性[xmlement(“gsm”)]标记您的财产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; }
}
我的应用程序的输出:

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

aaa
bbb

您可以使用属性[XmlElement(“gsm”)]标记您的属性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; }
}
我的应用程序的输出:

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

aaa
bbb

已解决

在尝试其他一些建议之前,我自己设法解决了这个问题,并认为无论如何我都应该在这里发布修复程序

我让
收件人
实现
列表
。完成:)

公共类收件人:列表
{
私有列表gsms{get;set;}
公众受助人()
{
gsms=新列表();
}
公共IEnumerator GetEnumerator()
{
返回gsms.GetEnumerator();
}
}
公共类gsm
{
[XmlText]
公共字符串编号{get;set;}
[XmlAttribute]
公共字符串messageId{get;set;}
}

已解决

在尝试其他一些建议之前,我自己设法解决了这个问题,并认为无论如何我都应该在这里发布修复程序

我让
收件人
实现
列表
。完成:)

公共类收件人:列表
{
私有列表gsms{get;set;}
公众受助人()
{
gsms=新列表();
}
公共IEnumerator GetEnumerator()
{
返回gsms.GetEnumerator();
}
}
公共类gsm
{
[XmlText]
公共字符串编号{get;set;}
[XmlAttribute]
公共字符串messageId{get;set;}
}

您的xml文件现在的结构如何?我现在将用我的当前结果更新问题。您的xml文件现在的结构如何?我现在将用我的当前结果更新问题。对不起,我是新来的。代码块的某些部分(类名声明行)呈现为简单文本抱歉,我是新来的。代码块的某些部分(类名声明行)被呈现为简单文本。在修复我的解决方案(如上所述)之前,我没有机会对此进行测试-这是一个很好的简单方法,可以在将来修复它,所以无论如何,谢谢