C# XML子元素反序列化引发InvalidOperationException
我试图手动反序列化数据对象的层次结构(下面是完整的代码),但遇到了一个我不理解的异常C# XML子元素反序列化引发InvalidOperationException,c#,xml,ixmlserializable,C#,Xml,Ixmlserializable,我试图手动反序列化数据对象的层次结构(下面是完整的代码),但遇到了一个我不理解的异常 DEMDataSet包含一组demographicsreportgroup对象 demographicsreportgroup实现IXmlSerializable,包含机构对象 Agency对象包含叶数据项dAgency.01,也称为emsagencyuniquesteid 我正在为DemographicReportGroup实现ReadXml方法,但是我得到一个异常抛出,如下所示: #region Rea
包含一组DEMDataSet
对象demographicsreportgroup
实现demographicsreportgroup
,包含IXmlSerializable
对象机构
对象包含叶数据项Agency
,也称为dAgency.01
emsagencyuniquesteid
DemographicReportGroup
实现ReadXml
方法,但是我得到一个异常抛出,如下所示:
#region ReadXml
public void ReadXml(System.Xml.XmlReader xmlReader)
{
xmlReader.MoveToContent();
this.timeStamp = DateTime.Parse(xmlReader.GetAttribute("timeStamp"));
if (xmlReader.IsEmptyElement) return;
xmlReader.ReadStartElement();
if (xmlReader.Name == "dAgency")
{
xmlReader.ReadStartElement("dAgency");
// **Exception here: System.InvalidOperationException**
this.Agency = new XmlSerializer(typeof(Agency)).Deserialize(xmlReader) as Agency;
xmlReader.ReadEndElement();
}
xmlReader.ReadEndElement();
}
#endregion
System.InvalidOperationException:不应为
到目前为止,我找到的所有代码示例都表明这应该是可行的。。。也许这是对XML属性的错误配置
希望有人能帮忙
此外,如果您好奇:
- 为什么要实现
?IXmlSerializable
属性是日期/时间。如果它是一个普通的timeStamp
,则在序列化时它将始终具有一个值(1/1/0001)。DateTime
类型让我知道它什么时候没有值,但不能序列化为属性。本例所属的数据标准规定时间戳必须是一个属性DateTime?
- 如何实现ShouldSerializetimeStampValue?
- 这将产生一个额外的属性和方法(timeStampValue和ShouldSerializetimeStampValue),这对于一个数据项来说太多了。而且,这不是我处理的唯一时间戳
完整代码(作为Visual Studio的单元测试):
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Xml.Serialization;//System.Xml.dll。
使用Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Tests.Xml
{
[测试类]
公共类TestIXmlSerializable
{
[测试方法]
public void反序列化childelement()
{
var xml=@”
M
";
var xmlSerializer=新的xmlSerializer(typeof(DEMDataSet));
DEMDataSet DEMDataSet=null;
使用(var streamReader=newstringreader(xml))
demDataSet=xmlSerializer。反序列化(streamReader)为demDataSet;
}
}
[可序列化]
///人口统计数据集的根标记
[XmlType(AnonymousType=true,命名空间=”http://www.nemsis.org")]
[XmlRoot(命名空间=”http://www.nemsis.org“,IsNullable=false)]
公共部分类DEMDataSet
{
#区域人口统计报告组
私人名单(人口统计报告组),;
///容器标签,用于保存人口统计记录的每个实例
[XmlElement(“人口统计报告”)]
公共列表人口统计报告组
{
得到
{
返回此。\u demographicsreportgroup;
}
设置
{
此._demographicsreportgroup=值;
}
}
#端区
}
[可序列化]
公共部分类DemographicReportGroup:IXmlSerializable
{
#地区机构
私人机构(简称"私人机构"),;
///
[xmlement(“dAgency”,IsNullable=false)]
公共机构
{
得到
{
把这个还给我;
}
设置
{
这个._机构=价值;
}
}
#端区
#区域时间戳
私有日期时间?\u时间戳;
///
[XmlAttribute]
公共日期时间?时间戳
{
得到
{
返回此。\u时间戳;
}
设置
{
这。_timeStamp=值;
}
}
#端区
#区域GetSchema
public System.Xml.Schema.XmlSchema GetSchema()
{
返回null;
}
#端区
#区域读取XML
public void ReadXml(System.Xml.XmlReader)
{
xmlReader.MoveToContent();
this.timeStamp=DateTime.Parse(xmlReader.GetAttribute(“timeStamp”);
if(xmlReader.IsEmptyElement)返回;
xmlReader.ReadStartElement();
if(xmlReader.Name==“dAgency”){xmlReader.ReadStartElement(“dAgency”);this.Agency=新的XmlSerializer(typeof(Agency))。反序列化(xmlReader)为代理;xmlReader.ReadEndElement();}
xmlReader.ReadEndElement();
}
#端区
#区域WriteXml
public void WriteXml(System.Xml.XmlWriter)
{
if(this.timeStamp.HasValue)xmlWriter.WriteAttributeString(“timeStamp”),this.timeStamp.Value.ToString(“o”);
如果(this.Agency!=null){xmlWriter.writeStarteElement(“dAgency”);新的XmlSerializer(typeof(Agency));xmlWriter.WriteEndElement();}
}
#端区
}
[可序列化]
///
[XmlType(命名空间=”http://www.nemsis.org")]
[XmlRoot(命名空间=”http://www.nemsis.org“,IsNullable=true)]
公共部分阶级机构
{
#区域Emsagencyuniquestead
私有字符串_emsagencyuniquesteid;
///分配给EMS机构的唯一ID,与所有州许可证号码和信息关联。
[XmlElement(“dAgency.01”)]
公共字符串emsagencyuniquesteid
{
得到
{
将此返回。\u emsagencyuniquesteid;
}
设置
{
此值为.\u emsagencyuniquestead=值;
}
}
#端区
}
}
使用Linq转换Xml怎么样
var xml = @"<DEMDataSet xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""http://www.nemsis.org http://nemsis.org/media/XSD_v3/_nemsis_v3.3.1/3.3.1.130201/XSDs/NEMSIS_XSDs_v3.3.1.130201/DEMDataSet_v3.xsd"" xmlns=""http://www.nemsis.org"">
<DemographicReport timeStamp=""1969-03-14T07:38:20+07:00"">
<dAgency>
<dAgency.01>M</dAgency.01>
</dAgency>
</DemographicReport>
</DEMDataSet>";
var xDoc = XDocument.Parse(xml);
XNamespace ns = "http://www.nemsis.org";
var result = xDoc.Descendants(ns + "DemographicReport")
.Select(d => new DemographicReportGroup
{
timeStamp = (DateTime)d.Attribute("timeStamp"),
Agency = new Agency{EMSAgencyUniqueStateID = d.Descendants(ns + "dAgency.01").First().Value}
})
.ToList();
我将在内存中构建一个
DEMDataSet
对象,然后
var xml = @"<DEMDataSet xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""http://www.nemsis.org http://nemsis.org/media/XSD_v3/_nemsis_v3.3.1/3.3.1.130201/XSDs/NEMSIS_XSDs_v3.3.1.130201/DEMDataSet_v3.xsd"" xmlns=""http://www.nemsis.org"">
<DemographicReport timeStamp=""1969-03-14T07:38:20+07:00"">
<dAgency>
<dAgency.01>M</dAgency.01>
</dAgency>
</DemographicReport>
</DEMDataSet>";
var xDoc = XDocument.Parse(xml);
XNamespace ns = "http://www.nemsis.org";
var result = xDoc.Descendants(ns + "DemographicReport")
.Select(d => new DemographicReportGroup
{
timeStamp = (DateTime)d.Attribute("timeStamp"),
Agency = new Agency{EMSAgencyUniqueStateID = d.Descendants(ns + "dAgency.01").First().Value}
})
.ToList();
public class DemographicReportGroup
{
public Agency Agency { set; get; }
public DateTime timeStamp;
}
public class Agency
{
public string EMSAgencyUniqueStateID { set; get; }
}