2

次の xml を自分のクラスにデシリアライズしたいのですが、tcp/ip 経由でデバイスから送信されるため、xml を変更できません。

<?xml version="1.0" encoding="utf-8"?>
<CONTACTINFORMATION UID="1234">
 <LoginId><![CDATA[1234]]></LoginId>
<ContactId><![CDATA[2134]]></ContactId>
<ContactType>CCININTERN</ContactType>
<Status>CONVERSATION</Status>
<From><![CDATA[123]]></From>
<To><![CDATA[123]]></To>
<WaitTime><![CDATA[123]]></WaitTime>

<ContactPropertySummary>
  <ContactProperty>
    <Name><![CDATA[13]]></Name>
    <Value><![CDATA[13]]></Value>
    <Hidden>NO</Hidden>
    <Url><![CDATA[13]]></Url>
  </ContactProperty>
</ContactPropertySummary>

<SkillSummary>
  <Skill>
    <Name><![CDATA[123]]></Name>
    <Mandatory>YES</Mandatory>
  </Skill>

  <Skill>
    <Name><![CDATA[124]]></Name>
    <Mandatory>YES</Mandatory>
  </Skill>
</SkillSummary>

<ContactCodeSummary>
  <ContactCode>
    <Id>123</Id>
    <Hidden>NO</Hidden>
    <Assigned>YES</Assigned>
  </ContactCode>

</ContactCodeSummary>
<GroupSummary>
  <Group>
    <Name><![CDATA[123]]></Name>
    <Mandatory>YES</Mandatory>
  </Group>

</GroupSummary>
<PreviousAgent><![CDATA[2]]></PreviousAgent>
<ScratchPadId><![CDATA[2]]></ScratchPadId>
<ScratchPadData><![CDATA[2]]></ScratchPadData>
<FaxSpecific>
  <NbrOfPages>2</NbrOfPages>
</FaxSpecific>
 </CONTACTINFORMATION>

私のクラス:

 [Serializable]
 [XmlRoot("CONTACTINFORMATION")]
 public class Contact
  {
    #region :: PROPERTIES ::
    public string LoginId { get; set; }
    public string ContactId { get; set; }
    public ContactType ContactType { get; set; }
    public ContactStatus Status { get; set; }
    [XmlElement("From")]
    public string ContactFrom { get; set; }
    [XmlElement("To")]
    public string ContactTo { get; set; }
    public int WaitTime { get; set; }

    [XmlElement("SkillSummary", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [XmlArray("Skill")]
    //[XmlElement("SkillSummary",  Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public Skill[] Skills { get; set; }


    [XmlArray("ContactPropertySummary")]
    public ContactProperty[] Properties { get; set; }


    [XmlArray("GroupSummary", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [XmlArrayItem("Group", typeof(Group), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public Group[] Groups { get; set; }
 }

スキルの配列には 2 つのスキルがあり、逆シリアル化した後、配列には 1 つのスキルしかなく、グループとプロパティの配列は null です...

私が間違っているのは何ですか?

4

2 に答える 2

6
  1. 配列プロパティを XmlArray および XmlArrayItem 属性で適切に装飾する必要があります。たとえば、スキル プロパティの場合、許可されていない XmlArray で XmlElement を使用しています。

    [XmlArrayItem("Skill", typeof(Skill), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [XmlArray("SkillSummary", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public Skill[] Skills
    {
      get;
      set;
    }
    
    [XmlArray("ContactPropertySummary")]
    [XmlArrayItem("ContactProperty", typeof(ContactProperty), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public ContactProperty[] Properties
    {
      get;
      set;
    }
    
    [XmlArray("GroupSummary", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [XmlArrayItem("Group", typeof(Group), Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public Group[] Groups
    {
      get;
      set;
    }
    
  2. xmlArrayItem の「タイプ」に適切な読み取り/書き込みプロパティがあることを確認してください

    public class Skill
    {
        public string Name
        {
            get;
            set;
        }
        public string Mandatory
        {
            get;
            set;
        }
    }
    

できるだけ多くの情報を、属性を通じて XMLSerializer に提供することをお勧めします。あなたはあまりにも的外れではないようです。上記の定義を使用して、提供された XML を正常に逆シリアル化することができました。

于 2012-08-20T10:54:00.830 に答える
2

クラス Skill を定義することから始め、次にこのクラスを Contract クラスで使用します。

// We're going to define a class called Skill
[Serializable()]
public class Skill
{
    [System.Xml.Serialization.XmlElement("Name")]
    public string Name { get; set; }

    [System.Xml.Serialization.XmlElement("Mandatory")]
    public string Mandatory { get; set; }
}

[Serializable]
[XmlRoot("CONTACTINFORMATION")]
public class Contact
{
   // ...... Rest of your elements
   [XmlArray("SkillSummary")]
   [XmlArrayItem("Skill", typeof(Skill))]
   public Skills[] Skill { get; set; }
}

グループとプロパティについても同様に行ってください。

于 2012-08-20T10:52:46.313 に答える