Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML子元素反序列化引发InvalidOperationException_C#_Xml_Ixmlserializable - Fatal编程技术网

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
      属性是日期/时间。如果它是一个普通的
      DateTime
      ,则在序列化时它将始终具有一个值(1/1/0001)。
      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; }
}