首页 > 解决方案 > 从对象序列化到 XML 字符串(复杂类型和列表)

问题描述

美好的一天,堆栈溢出的好居民,

菜鸟程序员在这里有另一个愚蠢的问题。我从一个没有通知就离开的人那里继承了一个非常大的项目时遇到问题。该应用程序是一个网络爬虫,它跟踪国际海运,然后通过肥皂服务 API 将生成的跟踪事件输入物流系统(Magaya Cargo System)。

事件数据是货件 XML 文件本身的一个节点,Magaya API 有一个特殊的方法,我可以使用它来插入这些事件。基本上,该方法SetTransactionEvents允许我指定货件编号并将与该货件相关的事件的 XML 字符串传递给它。我的问题是,当我尝试将我的事件序列化为 XML 字符串时,我无法以该方法预期会导致崩溃的正确结构形成 XML。我已经尝试了几种不同的方法,但我有点难以理解这些事件使用的复杂类型。

这是我的代码,首先是调用我的序列化方法的代码。为了简短起见,我省略了从网络爬虫跟踪结果中设置值的部分。没什么大不了的,只是一堆webeventDate = classeventDate……等等。:

EventType cur_event = new EventType();
EventDefinitionType eventDefinition = new EventDefinitionType();
// All Fields of the cur_event object are set here...
InsertEventIntoMagaya(cur_event);

请参阅下面的代码片段,显示我的代码的序列化部分,现在有一些虚拟变量:

public void InsertEventIntoMagaya(EventType currentEvent)
{
    MagayaApi api = new MagayaApi();
    try
    {
        XmlSerializer serializer = new XmlSerializer(typeof(EventType));
        StringBuilder result = new StringBuilder();
        using (var writer = XmlWriter.Create(result))
        {
            serializer.Serialize(writer, currentEvent);
            api.Cs.StartSession(api.User, api.Password, out int Key);
            api.Cs.SetTransactionEvents(Key, 0x00080000, "SH", "DUMMY999", result.ToString(), out string error);
            api.Cs.EndSession(Key);
        }
    }
    catch ( Exception ex)
    {
        MessageBox.Show(ex.Message);
        throw;
    }
}

还有应该出现的 XML 字符串示例(当然带有虚拟数据):

<?xml version="1.0" encoding="utf-8"?>
<Events xmlns = "http://www.magaya.com/XMLSchema/V1">
    <Event>
        <Date>2016-04-05T19:34:08+05:30</Date>
        <Details>Scanned</Details>
        <Location>Mumbai</Location>
        <EventDefinition>
            <Name>Cargo scanned in</Name>
            <IncludeInTracking>true</IncludeInTracking>
        </EventDefinition>
        <IncludeInTracking>true</IncludeInTracking>
        <OwnerType>SH</OwnerType>
        <OwnerNumber>162-78958749</OwnerNumber>
    <OwnerGUID>da3782e1-824b-4824-8ec2-0d38b032ab19</OwnerGUID>
    </Event>                                             
</Events>

提供 C# 字段定义和 XML 属性的类:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.magaya.com/XMLSchema/V1")]
[System.Xml.Serialization.XmlRootAttribute("Events", Namespace = "http://www.magaya.com/XMLSchema/V1", IsNullable = false)]
public partial class EventList
{
    private EventType[] eventField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Event")]
    public EventType[] Event
    {
        get
        {
            return this.eventField;
        }
        set
        {
            this.eventField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.magaya.com/XMLSchema/V1")]
[System.Xml.Serialization.XmlRootAttribute("Event", Namespace = "http://www.magaya.com/XMLSchema/V1", IsNullable = false)]
public partial class EventType
{
    private System.DateTime dateField;
    private string detailsField;
    private string locationField;
    private EventDefinitionType eventDefinitionField;
    private bool includeInTrackingField;
    private bool includeInTrackingFieldSpecified;
    private string ownerTypeField;
    private string ownerGUIDField;
    private string ownerNumberField;
    private string ownerURLField;

    /// <remarks/>
    public System.DateTime Date
    {
        get
        {
            return this.dateField;
        }
        set
        {
            this.dateField = value;
        }
    }

    /// <remarks/>
    public string Details
    {
        get
        {
            return this.detailsField;
        }
        set
        {
            this.detailsField = value;
        }
    }

    /// <remarks/>
    public string Location
    {
        get
        {
            return this.locationField;
        }
        set
        {
            this.locationField = value;
        }
    }

    /// <remarks/>
    public EventDefinitionType EventDefinition
    {
        get
        {
            return this.eventDefinitionField;
        }
        set
        {
            this.eventDefinitionField = value;
        }
    }

    /// <remarks/>
    public bool IncludeInTracking
    {
        get
        {
            return this.includeInTrackingField;
        }
        set
        {
            this.includeInTrackingField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool IncludeInTrackingSpecified
    {
        get
        {
            return this.includeInTrackingFieldSpecified;
        }
        set
        {
        this.includeInTrackingFieldSpecified = value;
        }
    }

    /// <remarks/>
    public string OwnerType
    {
        get
        {
            return this.ownerTypeField;
        }
        set
        {
            this.ownerTypeField = value;
        }
    }

    /// <remarks/>
    public string OwnerGUID
    {
        get
        {
            return this.ownerGUIDField;
        }
        set
        {
            this.ownerGUIDField = value;
        }
    }

    /// <remarks/>
    public string OwnerNumber
    {
        get
        {
            return this.ownerNumberField;
        }
        set
        {
            this.ownerNumberField = value;
        }
    }

    /// <remarks/>
    public string OwnerURL
    {
        get
        {
            return this.ownerURLField;
        }
        set
        {
            this.ownerURLField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.magaya.com/XMLSchema/V1")]
public partial class EventDefinitionType
{
    private string nameField;
    private string locationField;
    private string detailsField;
    private bool includeInTrackingField;
    private bool includeInTrackingFieldSpecified;

    /// <remarks/>
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }

    /// <remarks/>
    public string Location
    {
        get
        {
            return this.locationField;
        }
        set
        {
            this.locationField = value;
        }
    }

    /// <remarks/>
    public string Details
    {
        get
        {
            return this.detailsField;
        }
        set
        {
            this.detailsField = value;
        }
    }

    /// <remarks/>
    public bool IncludeInTracking
    {
        get
        {
            return this.includeInTrackingField;
        }
        set
        {
            this.includeInTrackingField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool IncludeInTrackingSpecified
    {
        get
        {
            return this.includeInTrackingFieldSpecified;
        }
        set
        {
            this.includeInTrackingFieldSpecified = value;
        }
    }
}

标签: c#xmlserialization

解决方案


推荐阅读