c# - 如何对我的结构接收到的 xml 响应进行类型转换(迭代)
问题描述
我基本上对c#很陌生。我正在做一个项目,我需要以 xml 格式向代理服务器发送请求并以 xml 格式接收响应。Broker 提供了一个 .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 具有第一级(定位请求)元素详细信息。但我不知道进入二级元素(即 LocateStatusApproved)。
下面是预定义并由经纪人提供的类。
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 {
}
解决方案
尝试以下:
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:\temp\test.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; }
}
}
推荐阅读
- javascript - 如何将动态列和行数据推送到antd表
- azure - 适用于 Linux 容器的 Azure 应用服务“始终开启”功能
- java - 如何将文件写入 ubuntu linux 服务器?爪哇 11
- amazon-web-services - AWS Certificate Manager - 如何为内部 ALB 创建公有证书?
- node.js - Node.js 从 Readable 检查 csv 编码
- pandas - 如何根据索引匹配对数据框中的值求和
- flutter - 如何使用 syncfusion_flutter_calendar 获取选定的月份和选定的日期值
- django - 应用两个人性化数字
- python - 带有 kwargs 移动函数对象的 Python 装饰器类
- bootstrap-5 - Bootstrap 垂直堆叠 2 列