2017-08-25 18 views
0

私はC#プロジェクトをやっていて、XMLでエンコードされたオブジェクトを持っています。XML属性と配列を正しくデシリアライズする方法

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Entity Type="StartRunTestSetResponse"> 
    <Fields> 
     <Field Name="SuccessStaus"> 
      <Value>2</Value> 
     </Field> 
     <Field Name="info"> 
      <Value></Value> 
     </Field> 
    </Fields> 
</Entity> 

オブジェクトにはキーと値のペアが必要であるため、属性情報が必要です。私のデシリアライゼーション文法は次のようになります

:今

[DataContract(Name="Entity", Namespace="")] 
[XmlSerializerFormat] 
[KnownType(typeof(SRTSRField))] 
[KnownType(typeof(SRTSRValue))] 
public class StartRunTestSetResponse 
{ 
    [DataMember(Name="Type"), XmlAttribute("Type")] 
    public string type { get; set; } 

    [DataMember(Name = "Fields", IsRequired = true), XmlElement("Fields")] 
    public List<SRTSRField> fields { get; set; } 

    internal StartRunTestSetResponse() { fields = new List<SRTSRField>(); } 
} 
[DataContract(Name = "Field", Namespace = "")] 
[KnownType(typeof(SRTSRValue))] 
public class SRTSRField 
{ 
    [DataMember(Name = "Name"), XmlAttribute("Name")] 
    public string name {get; set;} 

    [DataMember(Name = "Value"), XmlElement("Value")] 
    public SRTSRValue value { get; set; } 
} 
[DataContract(Name = "Value", Namespace = "")] 
public class SRTSRValue 
{ 
    [DataMember, XmlText] 
    public string value { get; set; } 
} 

、それは動作しません。現在はFields要素に解析され、その子はnullとなります。で

答えて

1

それは本当に便利だhttp://xmltocsharp.azurewebsites.net/

public class Entity 
{ 
    [XmlAttribute] 
    public string Type { get; set; } 
    [XmlArrayItem("Field")] 
    public Field[] Fields { get; set; } 
} 

public class Field 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

ので、デシリアライゼーションは、私は、XML LINQを使用して辞書を作成します

XmlSerializer ser = new XmlSerializer(typeof(Entity)); 
using (StringReader sr = new StringReader(xmlstring)) 
{ 
    var entity = (Entity)ser.Deserialize(sr); 

} 
+0

もうXML用のDataContractを使用することはありません。 – Olivier10178

0
[XmlRoot(ElementName="Field")] 
public class Field { 
    [XmlElement(ElementName="Value")] 
    public string Value { get; set; } 
    [XmlAttribute(AttributeName="Name")] 
    public string Name { get; set; } 
} 

[XmlRoot(ElementName="Fields")] 
public class Fields { 
    [XmlElement(ElementName="Field")] 
    public List<Field> Field { get; set; } 
} 

[XmlRoot(ElementName="Entity")] 
public class Entity { 
    [XmlElement(ElementName="Fields")] 
    public Fields Fields { get; set; } 
    [XmlAttribute(AttributeName="Type")] 
    public string Type { get; set; } 
} 

Createdy:あなたは、あなたのモデル簡素化することができ

0

だろう。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication74 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      Dictionary<string,int?> dict1 = doc.Descendants("Field") 
       .GroupBy(x => (string)x.Attribute("Name"), y => string.IsNullOrEmpty((string)y.Element("Value")) ? null : (int?)y.Element("Value")) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 


     } 

    } 



} 
関連する問題