【问题标题】:Deserialize working on XmlAttribute but not XmlElement反序列化处理 XmlAttribute 但不是 XmlElement
【发布时间】:2022-01-19 20:16:29
【问题描述】:

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

主要:

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 和 ConsignmentStructure 不知何故为空。 The result

我错过了什么?

【问题讨论】:

  • 有什么理由不直接从 Visual Studio 生成类而不是自己输入?
  • xmlns:ns1="http://bring.com/TransportV13R0i" 不是默认命名空间,因此该命名空间中实际存在的唯一 XML 元素是根元素本身 &lt;ns1:Transport&gt;。所有其他人都在空名称空间中。您可以通过应用 [XmlType(Namespace = "")] 来指定,相反,属性默认始终位于空命名空间中,因此它们可以成功反序列化。

标签: c# xml deserialization


【解决方案1】:

这对我来说完全可以反序列化,但您可能有理由不使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2012-09-02
    • 1970-01-01
    • 2014-02-26
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多