对XmlAttribute而不是XmlElement进行反序列化处理



我正在尝试对xml文档进行反序列化。我已经创建了一个类,该类包含用于存储值的自定义对象,但由于某些原因,它不会对XmlElement的任何内容进行反序列化。

Main:

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace Bring_Uppgift
{
class Program
{
static void Main(string[] args)
{
Transport T = new Transport();
String filepath = @"C:***Bing Uppgift";
XmlSerializer serializer = new XmlSerializer(typeof(Transport));
//StringReader reader = new StringReader(filepath + "\test1.xml");
//FileStream file = new FileStream(filepath + "\test1.xml", FileMode.Open, FileAccess.Read);
//StreamReader reader = new StreamReader(filepath + "\test1.xml");
using (StreamReader reader = new StreamReader(filepath + "\test1.xml"))
{
T = (Transport)serializer.Deserialize(reader);
}
Console.ReadLine();
}
}   
}

运输类别:

using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
namespace Bring_Uppgift
{
[Serializable]
[XmlRoot(ElementName = "Transport", Namespace = "http://bring.com/TransportV13R0i")]
public class Transport
{
[XmlElement(ElementName = "MessageDetails")]
public MessageDetails MessageDetails { get; set; }
[XmlElement(ElementName = "ConsignmentStructure")]
public ConsignmentStructure ConsignmentStructure { get; set; }
[XmlAttribute(AttributeName = "collaboration")]
public string Collaboration { get; set; }
[XmlAttribute(AttributeName = "messageFunction")]
public string MessageFunction { get; set; }
[XmlAttribute(AttributeName = "testIndicator")]
public string TestIndicator { get; set; }
[XmlAttribute(AttributeName = "messageId")]
public string MessageId { get; set; }
[XmlAttribute(AttributeName = "ns1", Namespace = "http://www.w3.org/2000/xmlns/")]
public string Ns1 { get; set; }
}

}

和xml对接:

<ns1:Transport collaboration="Instruction" messageFunction="Instruction" testIndicator="NO" messageId="00376516406000" xmlns:ns1="http://bring.com/TransportV13R0i">
<MessageDetails>
<MessageSender partyId="953675080" idType="30">
<Contact contactFunction="">
<ContactName>Bring Test</ContactName>
<ComDetails comType="Phone">1234567</ComDetails>
</Contact>
<OriginatingSystem>
<SystemId>BRINGMB</SystemId>
</OriginatingSystem>
</MessageSender>    
</MessageDetails>
<ConsignmentStructure structureType="Single">
<ConsignmentSet updateIndicator="Original">
<Consignment consignmentId="70712345678901234" idType="730">
<ControlTotals>
<NumberOfPackages>2</NumberOfPackages>
<GrossWeight unitCode="KGM">70</GrossWeight>
</ControlTotals>
<Reference referenceType="CMR">
<ReferenceNo>70713245679801234</ReferenceNo>
</Reference>
<Reference referenceType="CU">
<ReferenceNo>41234</ReferenceNo>
</Reference>
<Reference referenceType="ANT">
<ReferenceNo>4123456</ReferenceNo>
</Reference>
<Reference referenceType="DM">
<ReferenceNo>70712345678901234</ReferenceNo>
</Reference>
</Consignment>
</ConsignmentSet>
</ConsignmentStructure>
</ns1:Transport>

但当我运行代码时,MessageDetails和寄售结构不知何故为null。结果

我错过了什么?

这个反序列化对我来说非常好,但你可能有一个不使用Visual Studio为你生成类的原因:

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://bring.com/TransportV13R0i")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://bring.com/TransportV13R0i", IsNullable = false)]
public partial class Transport
{
private MessageDetails messageDetailsField;
private ConsignmentStructure consignmentStructureField;
private string collaborationField;
private string messageFunctionField;
private string testIndicatorField;
private ulong messageIdField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Namespace = "")]
public MessageDetails MessageDetails
{
get
{
return this.messageDetailsField;
}
set
{
this.messageDetailsField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Namespace = "")]
public ConsignmentStructure ConsignmentStructure
{
get
{
return this.consignmentStructureField;
}
set
{
this.consignmentStructureField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string collaboration
{
get
{
return this.collaborationField;
}
set
{
this.collaborationField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string messageFunction
{
get
{
return this.messageFunctionField;
}
set
{
this.messageFunctionField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string testIndicator
{
get
{
return this.testIndicatorField;
}
set
{
this.testIndicatorField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public ulong messageId
{
get
{
return this.messageIdField;
}
set
{
this.messageIdField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class MessageDetails
{
private MessageDetailsMessageSender messageSenderField;
/// <remarks/>
public MessageDetailsMessageSender MessageSender
{
get
{
return this.messageSenderField;
}
set
{
this.messageSenderField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class MessageDetailsMessageSender
{
private MessageDetailsMessageSenderContact contactField;
private MessageDetailsMessageSenderOriginatingSystem originatingSystemField;
private uint partyIdField;
private byte idTypeField;
/// <remarks/>
public MessageDetailsMessageSenderContact Contact
{
get
{
return this.contactField;
}
set
{
this.contactField = value;
}
}
/// <remarks/>
public MessageDetailsMessageSenderOriginatingSystem OriginatingSystem
{
get
{
return this.originatingSystemField;
}
set
{
this.originatingSystemField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public uint partyId
{
get
{
return this.partyIdField;
}
set
{
this.partyIdField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public byte idType
{
get
{
return this.idTypeField;
}
set
{
this.idTypeField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class MessageDetailsMessageSenderContact
{
private string contactNameField;
private MessageDetailsMessageSenderContactComDetails comDetailsField;
private string contactFunctionField;
/// <remarks/>
public string ContactName
{
get
{
return this.contactNameField;
}
set
{
this.contactNameField = value;
}
}
/// <remarks/>
public MessageDetailsMessageSenderContactComDetails ComDetails
{
get
{
return this.comDetailsField;
}
set
{
this.comDetailsField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string contactFunction
{
get
{
return this.contactFunctionField;
}
set
{
this.contactFunctionField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class MessageDetailsMessageSenderContactComDetails
{
private string comTypeField;
private uint valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string comType
{
get
{
return this.comTypeField;
}
set
{
this.comTypeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public uint Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class MessageDetailsMessageSenderOriginatingSystem
{
private string systemIdField;
/// <remarks/>
public string SystemId
{
get
{
return this.systemIdField;
}
set
{
this.systemIdField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class ConsignmentStructure
{
private ConsignmentStructureConsignmentSet consignmentSetField;
private string structureTypeField;
/// <remarks/>
public ConsignmentStructureConsignmentSet ConsignmentSet
{
get
{
return this.consignmentSetField;
}
set
{
this.consignmentSetField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string structureType
{
get
{
return this.structureTypeField;
}
set
{
this.structureTypeField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ConsignmentStructureConsignmentSet
{
private ConsignmentStructureConsignmentSetConsignment consignmentField;
private string updateIndicatorField;
/// <remarks/>
public ConsignmentStructureConsignmentSetConsignment Consignment
{
get
{
return this.consignmentField;
}
set
{
this.consignmentField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string updateIndicator
{
get
{
return this.updateIndicatorField;
}
set
{
this.updateIndicatorField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ConsignmentStructureConsignmentSetConsignment
{
private ConsignmentStructureConsignmentSetConsignmentControlTotals controlTotalsField;
private ConsignmentStructureConsignmentSetConsignmentReference[] referenceField;
private ulong consignmentIdField;
private ushort idTypeField;
/// <remarks/>
public ConsignmentStructureConsignmentSetConsignmentControlTotals ControlTotals
{
get
{
return this.controlTotalsField;
}
set
{
this.controlTotalsField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Reference")]
public ConsignmentStructureConsignmentSetConsignmentReference[] Reference
{
get
{
return this.referenceField;
}
set
{
this.referenceField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public ulong consignmentId
{
get
{
return this.consignmentIdField;
}
set
{
this.consignmentIdField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public ushort idType
{
get
{
return this.idTypeField;
}
set
{
this.idTypeField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ConsignmentStructureConsignmentSetConsignmentControlTotals
{
private byte numberOfPackagesField;
private ConsignmentStructureConsignmentSetConsignmentControlTotalsGrossWeight grossWeightField;
/// <remarks/>
public byte NumberOfPackages
{
get
{
return this.numberOfPackagesField;
}
set
{
this.numberOfPackagesField = value;
}
}
/// <remarks/>
public ConsignmentStructureConsignmentSetConsignmentControlTotalsGrossWeight GrossWeight
{
get
{
return this.grossWeightField;
}
set
{
this.grossWeightField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ConsignmentStructureConsignmentSetConsignmentControlTotalsGrossWeight
{
private string unitCodeField;
private byte valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string unitCode
{
get
{
return this.unitCodeField;
}
set
{
this.unitCodeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public byte Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ConsignmentStructureConsignmentSetConsignmentReference
{
private ulong referenceNoField;
private string referenceTypeField;
/// <remarks/>
public ulong ReferenceNo
{
get
{
return this.referenceNoField;
}
set
{
this.referenceNoField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string referenceType
{
get
{
return this.referenceTypeField;
}
set
{
this.referenceTypeField = value;
}
}
}

样本代码:

var transport =  (Transport)xmlSerializer.Deserialize(new StringReader(xml));
Console.WriteLine($"MessageDetails.MessageSender.OriginatingSystem.SystemId: {transport.MessageDetails.MessageSender.OriginatingSystem.SystemId}");
Console.WriteLine($"MessageDetails.MessageSender.Contact.ContactName: {transport.MessageDetails.MessageSender.Contact.ContactName}");
Console.WriteLine($"MessageDetails.MessageSender.partyId: {transport.MessageDetails.MessageSender.partyId}");

打印:

MessageDetails.MessageSender.OriginatingSystem.SystemId: BRINGMB
MessageDetails.MessageSender.Contact.ContactName: Bring Test
MessageDetails.MessageSender.partyId: 953675080

最新更新