我需要反序列化这个XML结构:
<?xml version="1.0" encoding="iso-8859-1" ?>
<vspaccess>
<vpstxid>A99C4831-D037-6A95-9DCF-E1CEC537875D</vpstxid>
<txstateid>0</txstateid>
<amount>0</amount>
<started />
<completed />
<vpsauthcode>0</vpsauthcode>
<batchid>0</batchid>
<aborted />
<released />
<applyavscv2>0</applyavscv2>
<apply3dsecure>0</apply3dsecure>
<authattempt>0</authattempt>
<threedattempt>0</threedattempt>
<eci>0</eci>
<t3mscore>0</t3mscore>
<surcharge>0</surcharge>
</vspaccess>
具有这种结构的类:
[XmlRoot("vspaccess")]
public class GetTransactionDetailResponse
{
[XmlElement(Type=typeof(TransactionDetail), Order = 1)]
public TransactionDetail Detail { get; set; }
}
public class TransactionDetail
{
[XmlElement("vpstxid", Order = 1)]
public string VpsTxId { get; set; }
// Rest of properties
}
但是,当我尝试它时,类"Detail"
的{{1}}属性
始终是GetTransactionDetailResponse
。
我尝试组合null
属性的大量重载但结果
永远是空的。
我无法修改xml结构,因为它是从Web服务和结构返回的
类XmlElement
的修复是固定的,因为它在代码中的很多地方使用(是遗留代码)。
stackoverflow中有很多关于从/向对象序列化/反序列化XML的示例,但我没有发现任何类似于我的情况。
答案 0 :(得分:0)
您可以将TransactionDetail类修改为:
[XmlRoot("vspaccess")]
public class TransactionDetail
{
public string vpstxid;
public byte txstateid;
public byte amount;
public object started;
public object completed;
public byte vpsauthcode;
public byte batchid;
public object aborted;
public object released;
public byte applyavscv2;
public byte apply3dsecure;
public byte authattempt;
public byte threedattempt;
public byte eci;
public byte t3mscore;
public byte surcharge;
}
然后你可以编写这样的反序列化代码:
XmlSerializer serializer = new XmlSerializer(typeof(TransactionDetail));
TransactionDetail td = null;
using (StreamReader reader = new StreamReader(path))
{
td = (TransactionDetail)serializer.Deserialize(reader);
}
最后,您可以使用刚刚反序列化的GetTransactionDetailResponse
对象设置TransactionDetail
对象的Detail属性。