我正在尝试手动反序列化数据对象的层次结构(下面提供完整代码),但是出现了一个我不理解的异常。

  • DEMDataSet包含DemographicReportGroup对象的集合。
  • DemographicReportGroup实现IXmlSerializable ,包含Agency对象。
  • Agency对象包含叶数据项dAgency.01 ,又名EMSAgencyUniqueStateID

我正在为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:不应预期<dAgency.01 xmlns =' http://www.nemsis.org '>。

到目前为止,我发现的所有代码示例均表明该方法可以正常工作。也许这是XML属性的配置错误?

希望有人可以提供帮助!

另外,如果您好奇:

  • 为什么要完全实现IXmlSerializable
    • timeStamp属性是日期/时间。 如果它是普通的DateTime ,则在序列化时它将始终具有值(1/1/0001)。 DateTime? 类型让我知道何时没有值,但是无法将其序列化为属性。 此示例所属的数据标准指示时间戳记必须是属性。
  • 如何实现ShouldSerializetimeStampValue?
    • 这将产生一个额外的属性和一个额外的方法(timeStampValue和ShouldSerializetimeStampValue),这对于一个数据项来说是太多代码。 另外,这不是我要处理的唯一时间戳。

完整代码(作为Visual Studio的单元测试):

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;  // System.Xml.dll.
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Tests.Xml
{
    [TestClass]
    public class TestIXmlSerializable
    {
        [TestMethod]
        public void DeserializeChildElement()
        {
            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 xmlSerializer = new XmlSerializer(typeof(DEMDataSet));

            DEMDataSet demDataSet = null;

            using (var streamReader = new StringReader(xml))
                demDataSet = xmlSerializer.Deserialize(streamReader) as DEMDataSet;

        }
    }

    [Serializable]
    /// <summary>Root Tag For Demographic DataSet</summary>
    [XmlType(AnonymousType = true, Namespace = "http://www.nemsis.org")]
    [XmlRoot(Namespace = "http://www.nemsis.org", IsNullable = false)]
    public partial class DEMDataSet
    {
        #region DemographicReportGroup
        private List<DemographicReportGroup> _demographicReportGroup;

        /// <summary>Container Tag to hold each instance of a demographic record</summary>
        [XmlElement("DemographicReport")]
        public List<DemographicReportGroup> DemographicReportGroup
        {
            get
            {
                return this._demographicReportGroup;
            }
            set
            {
                this._demographicReportGroup = value;
            }
        }
        #endregion

    }

    [Serializable]
    public partial class DemographicReportGroup : IXmlSerializable
    {
        #region Agency
        private Agency _agency;

        /// <summary></summary>
        [XmlElement("dAgency", IsNullable = false)]
        public Agency Agency
        {
            get
            {
                return this._agency;
            }
            set
            {
                this._agency = value;
            }
        }
        #endregion

        #region timeStamp
        private DateTime? _timeStamp;

        /// <summary></summary>
        [XmlAttribute]
        public DateTime? timeStamp
        {
            get
            {
                return this._timeStamp;
            }
            set
            {
                this._timeStamp = value;
            }
        }
        #endregion

        #region GetSchema
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
        #endregion

        #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"); this.Agency = new XmlSerializer(typeof(Agency)).Deserialize(xmlReader) as Agency; xmlReader.ReadEndElement(); }
            xmlReader.ReadEndElement();
        }
        #endregion

        #region WriteXml
        public void WriteXml(System.Xml.XmlWriter xmlWriter)
        {
            if (this.timeStamp.HasValue) xmlWriter.WriteAttributeString("timeStamp", this.timeStamp.Value.ToString("o"));
            if (this.Agency != null) { xmlWriter.WriteStartElement("dAgency"); new XmlSerializer(typeof(Agency)); xmlWriter.WriteEndElement(); }
        }
        #endregion
    }

    [Serializable]
    /// <summary></summary>
    [XmlType(Namespace = "http://www.nemsis.org")]
    [XmlRoot(Namespace = "http://www.nemsis.org", IsNullable = true)]
    public partial class Agency
    {
        #region EMSAgencyUniqueStateID
        private string _emsAgencyUniqueStateID;

        /// <summary>The unique ID assigned to the EMS Agency which is associated with all state licensure numbers and information.</summary>
        [XmlElement("dAgency.01")]
        public string EMSAgencyUniqueStateID
        {
            get
            {
                return this._emsAgencyUniqueStateID;
            }
            set
            {
                this._emsAgencyUniqueStateID = value;
            }
        }
        #endregion
    }
}

===============>>#1 票数:0

如何使用Linq To 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();

public class DemographicReportGroup
{
    public Agency Agency { set; get; }
    public DateTime timeStamp;
}

public class Agency
{
    public string EMSAgencyUniqueStateID { set; get; }
}

  ask by dythim translate from so

未解决问题?本站智能推荐:

1回复

xml反序列化产生的对象只有1个元素,尽管xml具有多个元素

我正在尝试测试webrequests的序列化。 我正在做一个单元测试,其中:-从服务器创建模拟响应-反序列化该响应-比较初始对象与反序列化的对象 问题是仅部分填充的数组之一,而不是所有元素,只有一个,最后一个。 由于xml模式的限制,必须手动进行反序列化。 Item是将DTO与xml
3回复

为什么这个反序列化会抛出StackOverflow异常?

当我尝试反序列化我的FooContainer(List)时抛出一个错误。 请看这段代码的最后一部分。 我究竟做错了什么?
4回复

c#使用IXmlSerializable反序列化

我有这样的xml: 我需要将它反序列化为课堂。 但问题是,那一周将来会发生变化(它将包含更多元素,以及我不知道的名称) 数据: AuditValue: 周: 但是在反序列化之后,我只有一个元素只有一个在字典值中被记录。 我做错了什么? GitHub
1回复

列表的XML序列化

我的格式为xml 我试图使用C#和IXmlSerializable接口序列化。 我有三个类,所有类都继承了接口IXmlSerializable,我的意图是XML将由最顶层的类读入,并且它将循环通过将类型“list”的xml传递到子对象序列化器。 然后,“list”序列化循环所有“特征
1回复

在类中使用时,IXmlSerializable不会反序列化

SerializableEnum实现了IXmlSerializable。 SerializableEnum还有一个可以工作的FromXml; 看起来如下: 当我做: 库存将填充数据,但Cmp将不会填充库存数据(看起来像ReadXml永远不会被调用)... 我已经尝
2回复

字典 序列化:在ReadXml()之后,将跳过后续的XML元素

在我的一个对象中,我有一个通过实现IXmlSerializable序列化的字典: 当我使用普通的.NET序列化程序序列化这些对象的列表时,它可以很好地进行序列化,但是反序列化只是在做一个对象-跳过可序列化字典之后的XML文件中的元素。 例如,我有一个<MaintenanceI
1回复

将XML元素序列化为其类名

简而言之,我希望从一组看起来如下的对象创建XML模式; 但我得到的是; QBXMLMsgsRq实际上是abstract class的集合,因为在不同类型的集合中可能存在许多请求(此处为InvoiceQueryRq,但也可能存在InvoiceAddRq,InvoiceDeleteR
1回复

具有自定义模式和IXmlSerializable的XML序列化

我正在尝试使用IXmlSerializable和XmlSchemaProviderAttribute序列化对象。 模式如下所示: 获得架构的代码如下所示(在此处找到): 现在,当我尝试使用XmlSerializer序列化对象时,出现一个异常:{“ PlanerModel.B
4回复

Xml序列化动态忽略

我正在尝试以特定格式生成xml文档。 我想跳过根据属性的值序列化属性。 如果Set为false,我希望整个属性不被序列化,我得到的xml应该是 代替 有什么方法可以用IXmlSerializable或其他任何东西干净利落地做到这一点? 谢谢!
1回复

使用数据协定序列化程序序列化IXmlSerializable对象时,如何控制根元素的名称空间和名称?

我有一个实现IXmlSerializable的类型,我正在使用DataContractSerializer序列化。 将其序列化为XML文档的根元素时,如何控制根元素的名称空间和名称? 说我有以下类型: 如果我以DataContractSerializer作为我的根对象来序列化它,