【问题标题】:XML Object SerializationXML 对象序列化
【发布时间】:2013-10-21 11:03:22
【问题描述】:

我正在尝试将数据发布到仅接受 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>

我的对象

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

我生成的 XML

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

【问题讨论】:

  • 您的 xml 文件现在的结构如何?
  • 我现在将使用我当前的结果更新问题。

标签: c# xml serialization xml-serialization xmlserializer


【解决方案1】:

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

【讨论】:

  • 对不起,我是新来的。代码块的某些部分(类名声明行)呈现为简单文本
【解决方案2】:

你只需要添加

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

它应该可以工作

【讨论】:

  • 在我设法修复我的解决方案(如上文所述)之前,我没有机会对此进行测试 - 这是将来修复它的好方法,所以无论如何谢谢。跨度>
【解决方案3】:

您可以使用 [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; }
}

示例代码:

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>

【讨论】:

    【解决方案4】:

    已解决

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

    我制作了recipients 实现List&lt;gsm&gt;。完成:)

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

    【讨论】:

    • 这真的很危险,除非你重载所有方法,否则它不会像List&lt;gsm&gt; 一样。例如recipients.Add(new gsm()) 将添加一个未被recipients.GetEnumerator() 枚举的元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2013-09-24
    • 2020-10-31
    • 2011-11-22
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多