我从两个不同的系统收到一个XML,我必须使用C#将其反序列化。两种xml都应该相同,但不幸的是它们略有不同,而且我无法对它们创建xml的系统产生影响。
<?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>
<?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.
所有这些都不起作用。
发件人:{" was not expected.} Deserializing 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);
}
获得与上述相同的错误。
发件人:{" was not expected.} Deserializing 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; }
}
与上述错误相同。
发件人:Ignore a property during xml serialization but not during deserialization
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-Attribut吗?