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

时间:2016-08-20 16:02:22

标签: c# xml xmlserializer .net-core

在过去一天左右,我一直在将我的应用程序从netcoreapp1.0升级到.NET Core net451。大多数过程都非常顺利,所有内容都被移植到我看到的第一个问题上。

我正在使用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的一部分。我一直无法找到处理未知属性的另一种方法,并且会欣赏指向正确方向的指针。

1 个答案:

答案 0 :(得分:2)

您可以向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