反序列化简单纯XML以组成对象

时间:2014-02-06 16:09:25

标签: c# xml-serialization

我需要反序列化这个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的示例,但我没有发现任何类似于我的情况。

1 个答案:

答案 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属性。