如何使用 ElementName 而不是属性名称序列化对象?

我在使用DataContractSerializer. 我面临的问题是生成的 XML 文件总是具有为类和字段定义名称的标签,而不是在XmlRoot或XmlElement使用ElementName属性中设置的名称。例如对于定义如下的类:


[XmlRoot(ElementName = "customer")]

public class Customer

{

    [XmlElement(ElementName = "name")]

    public string Name { get; set; }

    [XmlElement(ElementName = "address")]

    public string Address { get; set; }

}

在我的情况下生成的 XML 总是:


<Customer>

    <Name>abc</Name>

    <Address>xyz</Address>

</Customer>

而我希望得到的输出是ElementName小写的输出:


<customer>

    <name>abc</name>

    <address>xyz</address>

</customer>

我正在使用扩展方法通过 C# 对象使用以下方法进行序列化:


public static XDocument SerializeToXElement(object o)

{

    XDocument doc = new XDocument();


    using (var writer = doc.CreateWriter())

    {

        var serializer = new DataContractSerializer(o.GetType());

        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

        ns.Add("", "");

        serializer.WriteObject(writer, o);

    }


    doc.StripNamespace();


    return doc;

}

我的序列化函数中还调用了另一个扩展方法来从 my 中去除命名空间XDocument,如下所示:


public static void StripNamespace(this XDocument document)

{

    if (document.Root == null) return;


    foreach (var element in document.Root.DescendantsAndSelf())

    {

        element.Name = element.Name.LocalName;

        element.ReplaceAttributes(GetAttributesWithoutNamespace(element));

    }

}

我该怎么做才能使 DataContractSerializer 使用ElementName而不是类/属性名称?


蝴蝶刀刀
浏览 197回答 2
2回答

蝴蝶不菲

根据我的评论,您应该使用 DataContract 和 DataMember 属性而不是XmlRootand XmlElement:[DataContract(Name = "customer", Namespace = "")]public class Customer{&nbsp; &nbsp; [DataMember(Name = "name")]&nbsp; &nbsp; public string Name { get; set; }&nbsp; &nbsp; [DataMember(Name = "address")]&nbsp; &nbsp; public string Address { get; set; }}

呼唤远方

这应该对你有用,[XmlRoot("customer")]public class Customer{&nbsp; &nbsp; [XmlElement("name")]&nbsp; &nbsp; public string Name { get; set; }&nbsp; &nbsp; [XmlElement("address")]&nbsp; &nbsp; public string Address { get; set; }}
打开App,查看更多内容
随时随地看视频慕课网APP