. net Core中未知属性的XML序列化

本文关键字:XML 序列化 属性 未知 Core net | 更新日期: 2023-09-27 18:03:18

在过去的一天左右,我一直在将我的应用程序从net451升级到。net Core, netcoreapp1.0。大部分过程进行得很顺利,所有的东西都移植过来了——我只看到一个问题。

我使用System.XmlSystem.Xml.Serialization从API端点序列化XML(我绝对无法控制)。它工作得很好,但是,由于XML的问题,总是有一个属性返回为UnknownAttribute。我通过像这样连接到UknownAttribute事件来处理它:

XmlReader reader = XmlReader.Create(stream);
var serializer = new XmlSerializer(typeof(PersonDetails));
var personDetails = (PersonDetails)serializer.Deserialize(reader);
serializer.UnknownAttribute += new XmlAttributeEventHandler((object sender, XmlAttributeEventArgs e) => {
    unknownAttr.Add(e.Attr.Name, e.Attr.Value);
});
// Handle the missing map value if it exists.
string addressValue;
if(unknownAttr.TryGetValue("Address_x0_", out addressValue))
{
    personDetails.Address = addressValue;
}

升级到。net Core后,我现在使用System.Xml.XmlSerializer 4.0.11库。现在,似乎UnknownAttribute事件不再是XmlSerializer的一部分了。我一直无法找到另一种方法来处理未知属性,并将感激指针在正确的方向。

. net Core中未知属性的XML序列化

不使用未知属性事件,您可以将public XmlAttribute[] XmlAttributes属性添加到PersonDetails,用[XmlAnyAttribute]标记它,并在那里处理未知属性:

public class PersonDetails
{
    [XmlAttribute]
    public string Address { get; set; }
    [XmlAnyAttribute]
    public XmlAttribute[] XmlAttributes
    {
        get
        {
            return null;
        }
        set
        {
            if (value != null)
            {
                foreach (var attr in value)
                    if (attr.Name == "Address_x0_")
                        Address = attr.Value;
            }
        }
    }
}

正如你所发现的,你需要添加https://www.nuget.org/packages/System.Xml.XmlDocument/来使用。net Core中的XmlAttribute