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

本文关键字:属性 一个 序列化 键值对 xml 元素 | 更新日期: 2023-09-27 18:33:45

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

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

谢谢。

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

您需要

StateValue字段标记为XmlText,将UserList<State>字段标记为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字段值采用非常精确的格式。 如果 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>