2014-02-06 29 views
1

我需要反序列化这个XML结构:反序列化简单纯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"财产类GetTransactionDetailResponse 总是null

我试过结合了很多XmlElement属性的重载,但结果 始终为空。

我不能修改XML结构,因为是从web服务和类GetTransactionDetailResponse的结构 是因为固定在返回大量的代码中的地方使用(是遗留代码)。

有很多关于从/到对象序列化/反序列化XML的stackoverflow中的示例,但我还没有发现任何与我的情况类似。

回答

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对象。