【问题标题】:Serializing key value pairs into xml elements with the key being an attribute将键值对序列化为 xml 元素,其中键是属性
【发布时间】:2014-12-08 20:39:08
【问题描述】:

好的,所以我将一个类序列化为 xml,以作为 HttpResponse 发送。部分数据是“状态”列表,我只是不知道如何按照我需要的方式对其进行格式化。

现在 xml 响应看起来像这样:

<user id="x" date="x" ...>
    <state>
        <state name="Email" />
            <Value>email@mail.com</Value>
        </state>
    </state>
    <state>
        <state name="Level" />
            <Value>0</Value>
        </state>
    </state>
</user>

我不希望一个元素中的元素,并且不是它自己的元素,而是状态元素的值。我希望它看起来像

<user id="x" date="x" ...>        
    <state name="Email">email@email.com</state>
    <state name="Level">0</state>
</user>

现在我的课程是:

[XmlRoot("user")]
public class User {
    [XmlAttribute]
    public int Id { get; set; }

    [XmlAttribute]
    public DateTime Date { get; set; }

    [XmlArray]
    public List<State> State { get; set; }

}

public struct State {
    [XmlAttribute]
    public string Name { get; set; }

    public string Value { get; set; }
}

谁能告诉我我做错了什么? 我无法更改预期的输出,接收这​​些响应的服务已经存在并且不受我的控制。

谢谢。

【问题讨论】:

    标签: c# xml serialization xml-serialization


    【解决方案1】:

    您需要将StateValue 字段标记为XmlText,并将UserList&lt;State&gt; 字段标记为XmlElement,并进行一些小的元素名称更改,如下所示:

    public struct State
    {
        [XmlAttribute("name")]
        public string Name { get; set; }
    
        [XmlText]
        public string Value { get; set; }
    
        public override string ToString()
        {
            return string.Format("Name={0}, Value=\"{1}\"", Name, Value);
        }
    }
    
    [XmlRoot("user")]
    public class User
    {
        [XmlAttribute("id")]
        public int Id { get; set; }
    
        [XmlAttribute("date")]
        public DateTime Date { get; set; }
    
        [XmlElement("state")]
        public List<State> State { get; set; }
    }
    

    顺便说一句,XmlSerializer 要求 DateTime 字段值为 in a very precise format。如果您的 XML 日期不是这种格式,则需要手动解析该字段。

    然后,当我这样做时:

            var newUser = new User() { Id = 1, Date = DateTime.Today, State = new State[] { new State() { Name = "Email", Value = "email@mail.com" }, new State() { Name = "Level", Value = "0" } }.ToList() };
            var newXml = newUser.GetXml();
            Debug.WriteLine(newXml);
    

    我得到了输出:

    <?xml version="1.0" encoding="utf-16"?>
    <user xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="1" date="2014-12-08T00:00:00-05:00">
        <state name="Email">email@mail.com</state>
        <state name="Level">0</state>
    </user>
    

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多