Как типизировать (повторять) XML-ответ, полученный в моей структуре

#c# #xml

#c# #xml

Вопрос:

Я в принципе очень новичок в c #. Я делаю один проект, в котором мне нужно отправить запрос на сервер брокера в формате xml и получить ответ в формате xml. Брокер предоставил один файл .cs с некоторыми определенными классами. мне нужно повторить ответ для этого класса. я могу выполнить итерацию первого уровня XML-ответа для своего класса, но я не могу выполнить итерацию второго уровня ответа. Пожалуйста, подскажите мне, как выполнить итерацию до класса LocateStatus.

Пример ответа брокера

 <LocateResponse xmlns="http://www.omni.com/StockLoan/LocateService"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omni.com/StockLoan/LocateService LocateService-1.0.xsd ">
 <Locates>
 <Locate>
 <LocateRequest acceptManualApproval="false" acceptPartial="false" requestorReference="1" market="US"
requestedQuantity="1000" securityId="AAPL UW" securityIdentifierType="BBG_TICKER" />
 <LocateStatusApproved locateId="10010" approvedQuantity="1000" rateDescription="GC" rate="0.35"
rateIndicator="FEE" approvedTimeUTC="2015-01-31T12:00:00.000Z" xsi:type="LocateStatusApproved"/>
 </Locate>
 </Locates>
</LocateResponse>
 

Я повторяю это в своей структуре примерно так.

 LocateResponse locateresponse = OpmXMLUtil.convertXMLToRequestResponse<LocateResponse(responseFromServer);
 

locatresponse содержит сведения об элементах первого уровня (запрос местоположения). но я не знаю, как перейти к элементу второго уровня (который одобрен locatestatus).

Ниже приведен класс, который предопределен и задан брокером.

 public partial class LocateResponse {
    
    private Locate[] locatesField;        
    private string disclaimerField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)]
    public Locate[] Locates {
        get {
            return this.locatesField;
        }
        set {
            this.locatesField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(DataType="token", IsNullable=true)]
    public string Disclaimer {
        get {
            return this.disclaimerField;
        }
        set {
            this.disclaimerField = value;
        }
    }
}

public partial class Locate {
    
    private LocateRequest locateRequestField;        
    private LocateStatus itemField;

    /// <remarks/>
    public LocateRequest LocateRequest {
        get {
            return this.locateRequestField;
        }
        set {
            this.locateRequestField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("LocateStatusApproved", typeof(LocateStatusApproved))]
    [System.Xml.Serialization.XmlElementAttribute("LocateStatusPartiallyApproved", typeof(LocateStatusPartiallyApproved))]
    [System.Xml.Serialization.XmlElementAttribute("LocateStatusPending", typeof(LocateStatusPending))]
    [System.Xml.Serialization.XmlElementAttribute("LocateStatusRejected", typeof(LocateStatusRejected))]
    public LocateStatus Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
}

public abstract partial class LocateStatus {
    
    private statusCodeType statusCodeField;        
    private bool statusCodeFieldSpecified;        
    private string commentField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public statusCodeType statusCode {
        get {
            return this.statusCodeField;
        }
        set {
            this.statusCodeField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool statusCodeSpecified {
        get {
            return this.statusCodeFieldSpecified;
        }
        set {
            this.statusCodeFieldSpecified = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string comment {
        get {
            return this.commentField;
        }
        set {
            this.commentField = value;
        }
    }
}

public partial class LocateStatusApproved : LocateStatus {
    
    private System.DateTime approvedTimeUTCField;        
    private bool approvedTimeUTCFieldSpecified;        
    private string locateIdField;        
    private string approvedQuantityField;        
    private decimal rateField;        
    private bool rateFieldSpecified;        
    private rateIndicatorType rateIndicatorField;        
    private bool rateIndicatorFieldSpecified;        
    private rateDescriptionType rateDescriptionField;        
    private bool rateDescriptionFieldSpecified;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public System.DateTime approvedTimeUTC {
        get {
            return this.approvedTimeUTCField;
        }
        set {
            this.approvedTimeUTCField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool approvedTimeUTCSpecified {
        get {
            return this.approvedTimeUTCFieldSpecified;
        }
        set {
            this.approvedTimeUTCFieldSpecified = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string locateId {
        get {
            return this.locateIdField;
        }
        set {
            this.locateIdField = value;
        }
    }
    
    /// <remarks/>        [System.Xml.Serialization.XmlAttributeAttribute(DataType="positiveInteger")]
    public string approvedQuantity {
        get {
            return this.approvedQuantityField;
        }
        set {
            this.approvedQuantityField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal rate {
        get {
            return this.rateField;
        }
        set {
            this.rateField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool rateSpecified {
        get {
            return this.rateFieldSpecified;
        }
        set {
            this.rateFieldSpecified = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public rateIndicatorType rateIndicator {
        get {
            return this.rateIndicatorField;
        }
        set {
            this.rateIndicatorField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool rateIndicatorSpecified {
        get {
            return this.rateIndicatorFieldSpecified;
        }
        set {
            this.rateIndicatorFieldSpecified = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public rateDescriptionType rateDescription {
        get {
            return this.rateDescriptionField;
        }
        set {
            this.rateDescriptionField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool rateDescriptionSpecified {
        get {
            return this.rateDescriptionFieldSpecified;
        }
        set {
            this.rateDescriptionFieldSpecified = value;
        }
    }
}

public partial class LocateStatusPartiallyApproved : LocateStatusApproved {
}
 

Комментарии:

1. Если у вас есть Locate экземпляр, вы должны иметь возможность получить Item свойство (странное имя, на самом деле для статуса), которое имеет тип LocateStatus , а затем привести его к LocateStatusApproved .

Ответ №1:

Попробуйте выполнить следующее :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication176
{
    class Program
    {
        const string FILENAME = @"c:temptest.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            StringReader sReader = new StringReader(xml);
            XmlReader xReader = XmlReader.Create(sReader);
            XmlSerializer serializer = new XmlSerializer(typeof(LocateResponse));
            LocateResponse locateResponse = (LocateResponse)serializer.Deserialize(xReader);

        }
    }
    [XmlRoot(ElementName = "LocateResponse", Namespace = "http://www.omni.com/StockLoan/LocateService")]
    public partial class LocateResponse
    {
        [XmlArray("Locates")]
        [XmlArrayItem("Locate")]
        public Locate[] locatesField;
    }

    public partial class Locate
    {
        public LocateRequest LocateRequest { get; set; }
        public LocateStatusApproved LocateStatusApproved { get; set; }

     }
    public class LocateStatusApproved
    {
        [XmlAttribute()]
        public int locateId { get; set; }
        [XmlAttribute()]
        public int approvedQuantity { get; set; }
        [XmlAttribute()]
        public string rateDescription { get; set; }
        [XmlAttribute()]
        public decimal rate { get; set; }
        [XmlAttribute()]
        public string rateIndicator { get; set; }
        [XmlAttribute()]
        public DateTime approvedTimeUTC { get; set; }
        [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
        public string type { get; set; }


    }
    public class LocateRequest
    {
        [XmlAttribute()]
        public Boolean acceptManualApproval { get;set;}
        [XmlAttribute()]
        public Boolean acceptPartial { get; set; }
        [XmlAttribute()]
        public int requestorReference { get; set; }
        [XmlAttribute()]
        public string market { get; set; }
        [XmlAttribute()]
        public int requestedQuantity { get; set; }
        [XmlAttribute()]
        public string securityId { get; set; }
        [XmlAttribute()]
        public string securityIdentifierType { get; set; } 

    }
}