c# - 反序列化时忽略 xml 属性
问题描述
我从两个不同的系统收到一个必须用 c# 反序列化的 xml。两个 xml 应该是相同的,但不幸的是它们略有不同,我无法影响系统如何创建 xml。
xml1
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<alarm>
<alarmDetails>
<dateTime>20180906-121451</dateTime>
</alarmDetails>
<deviceDetails>
<deviceType>abacaxi</deviceType>
</deviceDetails>
<position>
<altitude>1000</altitude>
</position>
</alarm>
xml2
<?xml version="1.0" encoding="utf-8"?>
<alarm xmlns="http://alarm.com/xsd">
<alarmDetails>
<dateTime>20180906-114818</dateTime>
</alarmDetails>
<deviceDetails>
<deviceType>tapioca</deviceType>
</deviceDetails>
<position>
<altitude>1000</altitude>
</position>
</alarm>
(xml 2 在警报标签上有一个附加属性)
我试图用以下方法反序列化它:
代码
using System.IO;
using System.Xml.Serialization;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(Alarm));
StreamReader stream = new StreamReader("C:\\Temp\\xml1.xml");
Alarm alarmmessage = (Alarm)serializer.Deserialize(stream);
}
}
[XmlRoot(ElementName = "alarmDetails")]
public class AlarmDetails
{
[XmlElement(ElementName = "dateTime")]
public string DateTime { get; set; }
}
[XmlRoot(ElementName = "deviceDetails")]
public class DeviceDetails
{
[XmlElement(ElementName = "deviceType")]
public string DeviceType { get; set; }
}
[XmlRoot(ElementName = "position")]
public class Position
{
[XmlElement(ElementName = "altitude")]
public string Altitude { get; set; }
}
[XmlRoot(ElementName = "alarm")]
public class Alarm
{
[XmlElement(ElementName = "alarmDetails")]
public AlarmDetails AlarmDetails { get; set; }
[XmlElement(ElementName = "deviceDetails")]
public DeviceDetails DeviceDetails { get; set; }
[XmlElement(ElementName = "position")]
public Position Position { get; set; }
}
}
这非常适合 xml1 但对于 xml2 我得到这个错误:
错误
System.InvalidOperationException
Message=There is an error in XML document (2,2).
Inner Exception 1:
InvalidOperationException: <alarm xmlns='http://alarm.com/xsd'> was not expected.
可能的解决方案
这一切都没有奏效..
XmlRootAttribute
From: {" 不是预期的。} 反序列化 Twitter XML
我结束了这个修改:
static void Main(string[] args)
{
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "alarm";
xRoot.IsNullable = true;
XmlSerializer serializer = new XmlSerializer(typeof(Alarm), xRoot);
StreamReader stream = new StreamReader("C:\\Temp\\xml2.xml");
Alarm alarmmessage = (Alarm)serializer.Deserialize(stream);
}
得到与上述相同的错误。
IsNullable=true 到 XmlRoot
From: {" 不是预期的。} 反序列化 Twitter XML
[XmlRoot(ElementName = "alarm", IsNullable = true)]
public class Alarm
{
[XmlElement(ElementName = "alarmDetails")]
public AlarmDetails AlarmDetails { get; set; }
[XmlElement(ElementName = "deviceDetails")]
public DeviceDetails DeviceDetails { get; set; }
[XmlElement(ElementName = "position")]
public Position Position { get; set; }
}
与上述相同的错误。
XmlAttributeOverrides
来自:在 xml 序列化期间忽略属性,但在反序列化期间不忽略
static void Main(string[] args)
{
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = true;
attribs.XmlElements.Add(new XmlElementAttribute("alarm"));
overrides.Add(typeof(Alarm), "alarm", attribs);
XmlSerializer serializer = new XmlSerializer(typeof(Alarm), overrides);
StreamReader stream = new StreamReader("C:\\Temp\\xml2.xml");
Alarm alarmmessage = (Alarm)serializer.Deserialize(stream);
}
仍然与上述相同的错误。
建议?
我还能尝试什么来完成这项工作?是否有一些工作方法可以忽略 xmlns 属性?
解决方案
推荐阅读
- angular - 什么表示谷歌分析中的空页面?以及如何解决?
- sql - SQL Oracle - 按 ID、任务 ID、最小和最大时间戳分组
- python - 如何在不在终端上打印的情况下使用 os.getcwd() 获取我的密码?
- frama-c - 如何摆脱警告:“已保存文件中的 1 个状态被忽略。在此 Frama-C 配置中无效。”?
- python - 如何更改在reportlab python中绘制表格的x,y起点?
- javascript - 从地图中获取特定数据
- android - 如何使用 Kotlin Coroutines 正确执行 http 请求?
- angular - Angular 页面优化,减少页面加载时间
- python - 将 Bokeh USCounties 示例数据与我自己的数据框中的列值合并
- reactjs - Ckeditor5 react 插件创建不同的工具栏 - 显示“下标”、“上标”