【问题标题】:XmlSerializer. How do I deserialize following structure?XmlSerializer。如何反序列化以下结构?
【发布时间】:2023-03-26 06:04:02
【问题描述】:

Web 服务返回如下所示的文档:

<CarrierService.GetAlerts>
 <ResponseDO>
  <status>APPROVED</status>
  <action>OK</action>
  <code>SFW00542</code>
  <displayMsg/>
  <techMsg/>
 </ResponseDO>
 <AlertList count="1">
  <AlertItem>
   <docketNumber>MC758</docketNumber>
   <dotNumber>17952</dotNumber>
   <Change>
    <Field>rating</Field>
    <From>Conditional</From>
    <To>Satisfactory</To>
   </Change>
   <Change>
    <Field>rateDate</Field>
    <From>2010-08-31</From>
    <To>2010-12-20</To>
   </Change>
  </AlertItem>
 </AlertList>
</CarrierService.GetAlerts>

我正在使用 XmlSerializer,这就是我的映射类的外观:

[XmlRoot("CarrierService.GetAlerts")] 
public class GetAlertsResponse
{
    [XmlElement(ElementName = "ResponseDO")]
    public ResponseDo ResponseDo { get; set; }

    [XmlArray(ElementName = "AlertList")]
    public List<AlertItem> AlertList { get; set; }
}


public class AlertItem
{
    [XmlElement(ElementName = "docketNumber")]
    public string DocketNumber { get; set; }

    [XmlElement(ElementName = "dotNumber")]
    public string DOTNumber { get; set; }
}

我对 AlertItem.Change 有疑问。它在 AlertItem 中重复,并且没有包含在“ChangeList”中。

如何反序列化这些项目?

【问题讨论】:

  • 为什么不使用更改列表?与使用 AlertItem 列表的方式相同。

标签: c# .net xml xmlserializer


【解决方案1】:

您可以稍微作弊并在 List 上使用 XmlElement,XmlSerializer 会很乐意遵守。

public class AlertItem
{
    [XmlElement(ElementName = "docketNumber")]
    public string DocketNumber { get; set; }

    [XmlElement(ElementName = "dotNumber")]
    public string DOTNumber { get; set; }

    [XmlElement("Change")]
    public List<Change> Changes {get; set;}
}

public class Change
{
    [XmlElement("Field")]
    public string Field {get; set;}

    [XmlElement("From")]
    public string From {get; set;}

    [XmlElement("To")]
    public string To {get; set;}
}

【讨论】:

    【解决方案2】:

    如果您想创建更改列表,这将起作用

    <CarrierService.GetAlerts>
     <ResponseDO>
      <status>APPROVED</status>
      <action>OK</action>
      <code>SFW00542</code>
      <displayMsg/>
      <techMsg/>
     </ResponseDO>
     <AlertList count="1">
      <AlertItem>
       <docketNumber>MC758</docketNumber>
       <dotNumber>17952</dotNumber>
    <Changes>
       <Change>
        <Field>rating</Field>
        <From>Conditional</From>
        <To>Satisfactory</To>
       </Change>
       <Change>
        <Field>rateDate</Field>
        <From>2010-08-31</From>
        <To>2010-12-20</To>
       </Change>
    </Changes>
      </AlertItem>
     </AlertList>
    </CarrierService.GetAlerts>
    

    为了班级

    [XmlRoot("CarrierService.GetAlerts")] 
    public class GetAlertsResponse
    {
        [XmlElement(ElementName = "ResponseDO")]
        public ResponseDo ResponseDo { get; set; }
    
        [XmlArray(ElementName = "AlertList")]
        public List<AlertItem> AlertList { get; set; }
    }
    public class AlertItem
    {
        [XmlElement(ElementName = "docketNumber")]
        public string DocketNumber { get; set; }
    
        [XmlElement(ElementName = "dotNumber")]
        public string DOTNumber { get; set; }
    
        [XmlElement(ElementName = "Changes")]
        public Changes Changes { get; set; }
    }
    public class Changes
    {
        [XmlElement(ElementName = "Change")]
        public  List<Change> ChangesList { get; set; }
    }
    public class Change
    {
        [XmlElement("Field")]
        public string Field {get; set;}
    
        [XmlElement("From")]
        public string From {get; set;}
    
        [XmlElement("To")]
        public string To {get; set;}
    }
    

    【讨论】:

    • Matt,我无法控制 XML,因此有一个问题如何反序列化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多