XML .NET Core 中未知属性的序列化
XML Serialization of Unknown Attributes in .NET Core
在过去一天左右的时间里,我一直在将我的应用程序从 net451
升级到 .NET Core,netcoreapp1.0
。大部分过程进行得非常顺利,一切都被移植过来减去我看到的一个问题。
我使用 System.Xml
和 System.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
的一部分。我一直无法找到另一种方法来处理未知属性,希望得到正确方向的指示。
除了使用未知属性事件,您还可以将 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
。
在过去一天左右的时间里,我一直在将我的应用程序从 net451
升级到 .NET Core,netcoreapp1.0
。大部分过程进行得非常顺利,一切都被移植过来减去我看到的一个问题。
我使用 System.Xml
和 System.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
的一部分。我一直无法找到另一种方法来处理未知属性,希望得到正确方向的指示。
除了使用未知属性事件,您还可以将 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
。