2016-09-02 6 views
0

C I次のXMLがあります問題は構造をオブジェクトに#

<Root> 
<ProcessingUnit>Lifestyle</ProcessingUnit> 
<ProcessingData> 
    <ProcessType>Product</ProcessType> 
    <ProcessAction>Create</ProcessAction> 
    <Id>7</Id> 
</ProcessingData> 
</Root> 

と私、私は次の操作を行うデシリアライズすると、次のオブジェクト構造

[XmlRoot("Root")] 
public class XmlRoot 
{ 
    ProcessingUnit ProcessingUnit { get; set; } 
    [XmlElement("ProcessingData")] 
    ProcessingData ProcessingData { get; set; } 
} 

public class ProcessingData 
{ 
    public ProcessType ProcessType { get; set; } 
    public ProcessAction ProcessAction { get; set; } 
    public int Id { get; set; } 
} 

にあります

XmlSerializer _serializer = new XmlSerializer(typeof(XmlRoot)); 
using (var reader = new StringReader(stringtest)) 
{ 
    var tradeData = (XmlRoot)_serializer.Deserialize(reader); 
} 

enumsにデシリアライズすると、正しく処理されますが、processingUnitは正しくデシリアライズされますが、プロパティーProcessingDatanullです。

私は多くの異なるxml属性でデコレートしようとしましたが、なぜnull値を取得するのかわかりません。

EDIT: stringtest変数が値ました:

var stringtest = 
      "<Root><ProcessingUnit>Lifestyle</ProcessingUnit><ProcessingData><ProcessType>Product</ProcessType><ProcessAction>Create</ProcessAction><Id>7</Id></ProcessingData></Root>"; 

列挙型は次のようになります。

public enum ProcessType 
{ 
    [XmlEnum(Name = "Product")] 
    Product, 

    [XmlEnum(Name = "Category")] 
    Category, 
} 

public enum ProcessAction 
{ 
    [XmlEnum(Name = "Create")] 
    Create, 

    [XmlEnum(Name = "Delete")] 
    Delete, 

    [XmlEnum(Name = "Update")] 
    Update, 
} 

public enum ProcessingUnit 
{ 
    [XmlEnum(Name = "LifeStyle")] 
    LifeStyle 
} 
+0

よろしいですでなければなりませんあなたの 'stringtest'には実際のXMLが入っていますか?私はあなたが提供したコードに何らかの誤りを見ることができません。 – HimBromBeere

+0

シリアライズでは、シリアライズ/デシリアライズされるオブジェクトのためのパラメトリックコンストラクタが必要です。 ProcessingActionとProcessingTypeがこれらを提供していると確信していますか? – Jonas

+0

返信用Thansk、編集: – Diemauerdk

答えて

0

プロパティは、公共

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.Xml; 
using System.Xml.Serialization; 
using System.IO; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string stringtest = "<Root>" + 
       "<ProcessingUnit>Lifestyle</ProcessingUnit>" + 
       "<ProcessingData>" + 
        "<ProcessType>Product</ProcessType>" + 
        "<ProcessAction>Create</ProcessAction>" + 
        "<Id>7</Id>" + 
       "</ProcessingData>" + 
       "</Root>"; 

      XmlSerializer _serializer = new XmlSerializer(typeof(XmlRoot)); 
      using (var reader = new StringReader(stringtest)) 
      { 
       XmlRoot tradeData = (XmlRoot)_serializer.Deserialize(reader); 
      } 


     } 
    } 
    [XmlRoot("Root")] 
    public class XmlRoot 
    { 
     [XmlElement("ProcessingUnit")] 
     public ProcessingUnit ProcessingUnit { get; set; } 
     [XmlElement("ProcessingData")] 
     public ProcessingData ProcessingData { get; set; } 
    } 
    [XmlRoot("ProcessingData")] 
    public class ProcessingData 
    { 
     [XmlElement("ProcessType")] 
     public ProcessType ProcessType { get; set; } 
     [XmlElement("ProcessAction")] 
     public ProcessAction ProcessAction { get; set; } 
     [XmlElement("Id")] 
     public int Id { get; set; } 
    } 
    [XmlRoot("ProcessingUnit")] 
    public class ProcessingUnit 
    { 
     [XmlText] 
     public string text { get; set; } 
    } 
    [XmlRoot("ProcessType")] 
    public class ProcessType 
    { 
     [XmlText] 
     public string text { get; set; } 
    } 
    [XmlRoot("ProcessAction")] 
    public class ProcessAction 
    { 
     [XmlText] 
     public string text { get; set; } 
    } 
} 
+0

返事をありがとう。私はあなたの例を試して、それは動作します - しかし、私は文字列の代わりにenumを使用して、その後、私はエラー "XML文書(1,50)にエラーがあります" – Diemauerdk

+0

列挙型は文字列ではなく整数です。 – jdweng

+0

@jdwengこれはメモリには当てはまりますが、XMLシリアライザには当てはまりません。デフォルトでは、 'XmlSerializer'は実際には整数値ではなく列挙型の文字列名を使用します。 –