我有一个类,我想将其序列化为 xml。我想将生成的 xml(元素中的元素)中的一个属性下移一个级别,而不更改类的结构。是否可以使用 XmlSerializer 来执行此操作?
一个例子:
生成的xml:
<Person>
<firstname xmlns=\"http://myschema.com\">John</firstname>
<postcode xmlns=\"http://myschema.com\">N1 0XE</postcode>
</Person>
所需的 xml:
<Person>
<firstname xmlns=\"http://myschema.com\">John</firstname>
<address>
<postcode xmlns=\"http://myschema.com\">N1 0XE</postcode>
</address>
</Person>
代码:
[Serializable]
[XmlType(Namespace = "http://myschema.com")]
public class Person
{
[XmlElement("firstname")]
public string FirstName { get; set; }
[XmlElement("postcode")]
public string Postcode { get; set; }
}
序列化器:
var xmlSerializer = new XmlSerializer(typeof(Person));
var stringWriter = new StringWriter();
var xmlWriter = XmlWriter.Create(stringWriter);
xmlSerializer.Serialize(xmlWriter, person);
最佳答案
我知道更改生成的标准输出 xml 的唯一方法是实现 IXmlSerializable 。因此,您不必更改公共(public)结构,但必须提供某些方法的实现。
public class Person : IXmlSerializable
{
[XmlElement("firstname")]
public string FirstName { get; set; }
[XmlElement("postcode")]
public string Postcode { get; set; }
#region IXmlSerializable Member
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
if (reader.Read())
{
FirstName = reader.ReadInnerXml();
}
reader.Read();
Postcode = reader.ReadInnerXml();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteElementString("firstname ", FirstName);
writer.WriteStartElement("address");
writer.WriteElementString("postcode", Postcode);
writer.WriteEndElement();
}
#endregion
// for demo purposes only !
public override string ToString()
{
return FirstName + ", " + Postcode;
}
// source to test the exported file and read it right after!
Person p = new Person() { FirstName = "jon doe", Postcode = "N1 OX" };
XmlSerializer xs = new XmlSerializer(typeof(Person));
StreamWriter sw = new StreamWriter("export.xml");
xs.Serialize(sw, p);
sw.Close();
StreamReader sr = new StreamReader("export.xml");
Person p1 = xs.Deserialize(sr) as Person;
Debug.WriteLine(p1.ToString());
@XmlSubElement - 只有一堆 attributes available for xmlSerialization 。不幸的是,没有没有subElement或任何类似的东西。
关于c# - 如何使用 XmlSerializer 在不同级别指定 XmlElement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12266414/