将键值对序列化为xml元素,键为属性

时间:2014-12-08 20:39:09

标签: c# xml serialization xml-serialization

好的,所以我将一个类序列化为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>

我不想要一个元素中的元素,也不是它自己的元素,而是state元素的值。我希望它看起来像

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

您需要将Value的{​​{1}}字段标记为XmlText,将State的{​​{1}}字段标记为XmlElement,然后制作一些次要的元素名称更改,如下所示:

List<State>

顺便说一句,User要求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; } } 字段值为in a very precise format。如果您的XML日期不是这种格式,则需要手动解析该字段。

然后,当我这样做时:

XmlSerializer

我得到了输出:

DateTime