c# - 如何使用 XmlSerializer 在不同级别指定 XmlElement?

标签 c# xmlserializer

我有一个类,我想将其序列化为 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/

相关文章:

c# - XmlSerializer 忽略 Web Api 中的 [Xml 属性]

c# - 如何使用 XMLSerializer 序列化带有对象的非泛型 IList

c# - AZURE Blobs .ListBlobs() 扩展了限制

c# - 在集成测试期间调试 .NET Web 应用程序

c# - 网站上的母版页,但在 asp.net 的源代码中没有母版页?

c# - 未序列化的结构列表列表。 System.RuntimeType 由于其保护级别而无法访问。只能处理公共(public)类型

c# - 保留数据库中的空字符串

c# - 按钮图像未垂直居中

jaxb - 如何自定义 Jersey JAXB 序列化的 XML 输出

c# - XMLSerializer 并使用属性创建 XML 数组