Получение ошибки во время сериализации xml - PullRequest
0 голосов
/ 03 мая 2011

я хочу получить xml после сериализации следующим образом

<?xml version="1.0" encoding="windows-1252"?>
<OpenShipments xmlns="x-schema:C:\UPSLabel\OpenShipments.xdr">
<OpenShipment ShipmentOption="" ProcessStatus="">
    <ShipTo>
        <CompanyOrName>DARMOT Sp. z o.o</CompanyOrName>
        <Attention>DARMOT Sp. z o.o</Attention>
        <Address1>Ojca Damiana Tynieckiego 46</Address1>
        <Address2></Address2>
        <Address3>DarÂ3owo</Address3>
        <CountryTerritory>PL</CountryTerritory>
        <PostalCode>76-150</PostalCode>
        <CityOrTown>DarÂ3owo</CityOrTown>
        <StateProvinceCounty></StateProvinceCounty>
        <Telephone>943143185</Telephone>
    </ShipTo>
    <ShipmentInformation>
        <ServiceType>UPS Standard</ServiceType>
        <NumberOfPackages>1</NumberOfPackages>
        <DescriptionOfGoods>Remanufactured auto parts</DescriptionOfGoods>
        <BillingOption>PP</BillingOption>
    </ShipmentInformation>
    <Package>
        <PackageType>CP</PackageType>
        <Weight>1</Weight>
        <Reference1>OUR:AWP0021</Reference1>
        <Reference2>Job # 41149</Reference2>
        <DeclaredValue>
            <Amount>999</Amount>
        </DeclaredValue>
    </Package>
</OpenShipment>

Чтобы получить вышеупомянутый xml после сериализации xml из моего класса, я написал несколько классов, чтобы выполнить работу.

Мой полный код на c #:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace XML2List
{
public partial class ShipMain : Form
{
    public ShipMain()
    {
        InitializeComponent();
    }

    public string Serialize<T>(T obj)
    {
        string xmlString = null;

        try
        {
            MemoryStream memoryStream = new MemoryStream();
            XmlSerializer xs = new XmlSerializer(typeof(T));
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
            xs.Serialize(xmlTextWriter, obj);
            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
            xmlString = UTF8ByteArrayToString(memoryStream.ToArray()); return xmlString;
        }
        catch (Exception ex)
        {
            string xx = ex.Message.ToString();
        }
        return xmlString;
    }

    public string UTF8ByteArrayToString(byte[] characters)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        string constructedString = encoding.GetString(characters);
        return (constructedString);
    }

    private void ShipMain_Load(object sender, EventArgs e)
    {
        OpenShipments op = new OpenShipments();
        op.xmlns=@"C:\UPSLabel\OpenShipments.xdr";
        op.OpenShipment.ShipmentOption = "";
        op.OpenShipment.ProcessStatus = "";
        op.OpenShipment.ShipTo.CompanyOrName = "DARMOT Sp. z o.o";
        op.OpenShipment.ShipTo.Attention = "DARMOT Sp. z o.o";
        op.OpenShipment.ShipTo.Address1 = "Ojca Damiana Tynieckiego 46";
        op.OpenShipment.ShipTo.Address2 = "";
        op.OpenShipment.ShipTo.Address3 = "Dar³owo";
        op.OpenShipment.ShipTo.CountryTerritory = "PL";
        op.OpenShipment.ShipTo.PostalCode = "76-150";
        op.OpenShipment.ShipTo.CityOrTown = "Dar³owo";
        op.OpenShipment.ShipTo.StateProvinceCounty = "Dar³owo";
        op.OpenShipment.ShipTo.Telephone = "943143185";
        op.OpenShipment.ShipmentInformation.ServiceType = "UPS Standard";
        op.OpenShipment.ShipmentInformation.NumberOfPackages = "1";
        op.OpenShipment.ShipmentInformation.DescriptionOfGoods = "Remanufactured auto parts";
        op.OpenShipment.ShipmentInformation.BillingOption = "PP";
        op.OpenShipment.Package.PackageType = "CP";
        op.OpenShipment.Package.Weight = "1";
        op.OpenShipment.Package.Reference1 = "OUR:AWP0021";
        op.OpenShipment.Package.Reference2 = "Job # 41149";
        op.OpenShipment.Package.DeclaredValue.Amount = "999";
        string strRetXML=Serialize(op);
    }
}

public class OpenShipments
{
    string _xmlns = "";
    private OpenShipment _OpenShipment = null;

    [XmlAttribute]
    public string xmlns
    {
        get { return _xmlns; }
        set { _xmlns = "x-schema:" + value; }
    }

    [XmlElement("OpenShipment")]
    public OpenShipment OpenShipment
    {
        get { return _OpenShipment; }
        set { _OpenShipment = value; }
    }


    public OpenShipments()
    {
        OpenShipment = new OpenShipment();
    }


}

public class OpenShipment
{
    string _ShipmentOption = "";
    string _ProcessStatus = "";
    private ShipTo _ShipTo = null;
    private ShipmentInformation _ShipmentInformation = null;
    private Package _Package = null;

    public OpenShipment()
    {
        _ShipTo = new ShipTo();
        _ShipmentInformation = new ShipmentInformation();
        _Package = new Package();
    }

    [XmlElement("ShipTo")]
    public ShipTo ShipTo
    {
        get { return _ShipTo; }
        set { _ShipTo = value; }
    }


    [XmlElement("ShipmentInformation")]
    public ShipmentInformation ShipmentInformation
    {
        get { return _ShipmentInformation; }
        set { _ShipmentInformation = value; }
    }

    [XmlElement("Package")]
    public Package Package
    {
        get { return _Package; }
        set { _Package = value; }
    }

    [XmlAttribute]
    public string ShipmentOption
    {
        get { return _ShipmentOption; }
        set { _ShipmentOption =  value; }
    }

    [XmlAttribute]
    public string ProcessStatus
    {
        get { return _ProcessStatus; }
        set { _ProcessStatus = value; }
    }
}

public class ShipTo
{
    [XmlText]
    public string CompanyOrName { get; set; }
    [XmlText]
    public string Attention { get; set; }
    [XmlText]
    public string Address1 { get; set; }
    [XmlText]
    public string Address2 { get; set; }
    [XmlText]
    public string Address3 { get; set; }
    [XmlText]
    public string CountryTerritory { get; set; }
    [XmlText]
    public string PostalCode { get; set; }
    [XmlText]
    public string CityOrTown { get; set; }
    [XmlText]
    public string StateProvinceCounty { get; set; }
    [XmlText]
    public string Telephone { get; set; }

}

public class ShipmentInformation
{
    [XmlText]
    public string ServiceType { get; set; }
    [XmlText]
    public string NumberOfPackages { get; set; }
    [XmlText]
    public string DescriptionOfGoods { get; set; }
    [XmlText]
    public string BillingOption { get; set; }
}

public class Package
{
    private DeclaredValue _DeclaredValue = null;

    public Package()
    {
        _DeclaredValue = new DeclaredValue();
    }

    [XmlElement("DeclaredValue")]
    public DeclaredValue DeclaredValue
    {
        get { return _DeclaredValue; }
        set { _DeclaredValue = value; }
    }

    [XmlText]
    public string PackageType { get; set; }
    [XmlText]
    public string Weight { get; set; }
    [XmlText]
    public string Reference1 { get; set; }
    [XmlText]
    public string Reference2 { get; set; }
}

public class DeclaredValue
{
    [XmlText]
    public string Amount { get; set; }
}
}

Приведенный выше код, который я написал, чтобы получить вывод XML, который я дал вверху.когда я пытаюсь сериализовать класс, тогда я получаю.когда XmlSerializer xs = новый XmlSerializer (typeof (T));Строка исполняется, тогда происходит исключение.ошибка: «Произошла ошибка, отражающая тип« XML2List.OpenShipments ».»

Я не могу определить причину возникновения ошибки во время сериализации xml.В случае, если я не уверен, как я написал класс, который будет правильно генерировать желаемый xml, который я показал вверху.

, поэтому, пожалуйста, кто-нибудь подскажет мне, как исправить ошибку и получить XML после сериализации,также скажите мне, получу ли я желаемый вывод xml после сериализации, как я написал код.

пожалуйста, обсудите подробно.

1 Ответ

2 голосов
/ 03 мая 2011

Вам необходимо проверить внутренние исключения.

xmlns является зарезервированным словом и не должно быть объявлено как свойство в OpenShipments.


UPDATE

Согласно документации :

Только один экземпляр Класс XmlTextAttribute может быть применен в классе.

Вы определили XmlText для всех свойств ShipTo, следовательно, он не может сериализоваться. Вам нужно определить его только для одного свойства.

...