在.NET中如何指定XML序列化属性以支持命名空间前缀进行反序列化?

27

我有一个以下的XML:

<person xmlns:a="http://example.com" xmlns:b="http://sample.net">
    <a:fName>John</a:fName>
    <a:lName>Wayne</a:lName>
    <b:age>37</b:age>
</person>

如何在一个类上定义XML序列化属性以支持所描述的情景?

1个回答

60
你需要使用XmlElement特性的命名空间来指定每个字段所需的命名空间。这将允许你将字段与特定命名空间相关联,但你还需要在类上公开一个返回类型为XmlNamespaceDeclarations的属性以获取前缀关联。

请参阅文档和示例:

[XmlRoot(ElementName = "person")]
public class Person
{
    [XmlElement(Namespace = "http://example.com")]
    public string fname;

    [XmlElement(Namespace = "http://sample.com")]
    public string lname;

    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();

    public Person()
    {
        xmlns.Add("a", "http://example.com");
        xmlns.Add("b", "http://sample.com");
    }
}

1
提醒其他人的一点是,如果你只进行反序列化操作,似乎不需要XmlSerializerNamespaces这个东西,尽管我仍然认为这是一个好的实践。 - Piotr Owsiak
它只适用于元素,不适用于属性。 - bubi
属性有命名空间吗? - Mario The Spoon
@ZachBonham,XmlElement的链接不正确,应该是指向XmlElementAttribute的链接:https://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlelementattribute(v=vs.110).aspx - Richardissimo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接