将键值对序列化为 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; }
}
有人可以告诉我我做错了什么吗?我无法更改预期的输出,接收这些响应的服务是预先存在的,不受我的控制。
谢谢。
您需要
将State
的Value
字段标记为XmlText
,将User
的List<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>