为xml元素添加友好的name属性,使用c#属性进行序列化

本文关键字:属性 使用 序列化 name 元素 xml 添加 | 更新日期: 2023-09-27 18:15:52

我有一些从数据库生成的实体,我想将它们序列化为XML。问题是,一些实体的列名不太友好,这反映在生成的实体的字段中。

是否有一个c#属性,我可以应用到类字段,以便我可以添加一个xml属性,其中包含一个友好的名称值,到xml元素本身?例如,使用类似于XmlAttribute的内容:

public class Book
{
    public string Title { get; set; }
    [XmlAttribute("friendlyName","International Standard Book Number")]
    public string ISBN { get; set; }
} 

在序列化时应该会产生如下结果:

<Book>
  <Title>To Kill a Mockingbird</Title>
  <ISBN friendlyName="International Standard Book Number">9780061120084</ISBN>
</Book>

为xml元素添加友好的name属性,使用c#属性进行序列化

没有这样的属性。将元素文档与xml数据混合使用是不常见的。通常,您希望使用xsd文档或其他方式记录xml模式。

话虽如此,你可以这样做。您需要将ISBN属性从字符串更改为具有可以序列化的friendlyName属性的自定义类型。

public class Book
{
    public string Title { get; set; }
    public ISBN ISBN { get; set; }
}
public class ISBN
{
    [XmlText]
    public string value { get; set; }
    [XmlAttribute]
    public string friendlyName { get; set; }
}

以下内容将与您的问题中的内容完全相同。

Book b = new Book
{
    Title = "To Kill a Mockingbird",
    ISBN = new ISBN
    {
        value = "9780061120084",
        friendlyName = "International Standard Book Number",
    }
};

好的,另一种方法是创建一个自定义的XmlWriter,它可以拦截序列化器创建元素的调用。当为一个属性创建元素时,如果您想要为其添加一个友好的名称,您可以编写自己的自定义属性。

public class MyXmlTextWriter : XmlTextWriter
{
    public MyXmlTextWriter(TextWriter w)
        : base(w)
    {
    }
    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        base.WriteStartElement(prefix, localName, ns);
        switch(localName)
        {
            case "ISBN":
                WriteAttributeString("friendlyName", "International Standard Book Number");
                break;
        }
    }
}

下面是一个如何使用它的例子(从控制台应用程序):

XmlSerializer serializer = new XmlSerializer(typeof(Book));
serializer.Serialize(new MyXmlTextWriter(Console.Out), b);

您可以实现XmlTextWriter的其他构造函数,如果您需要能够写入其他东西,如Stream

试试这个

    [XmlRoot("Book")]
    public class Book
    {
        [XmlElement("Title")]
        public string Title { get; set; }
        [XmlElement("ISBN")]
        public ISBN isbn { get; set; }
    }
    [XmlRoot("ISBN")]
    public class ISBN
    {
        [XmlAttribute("friendlyName")]
        public string friendlyName { get; set; }
        [XmlText]
        public string value { get; set; }
    }​