2016-01-18 3 views
0

У меня есть следующие классы C#не в состоянии десериализации XML в общий список

[XmlTypeAttribute(AnonymousType = true)] 
public class TransactionTypesHolder 
{ 
    [XmlArrayItem("TransactionType", typeof(TransactionType))] 
    public List<TransactionType> TransactionTypes { get; set; } 

    public TransactionTypesHolder() 
    { 
     TransactionTypes = new List<TransactionType>(); 
    } 
} 


public class TransactionType 
{ 
    [XmlElement("Mti")] 
    public string Mti { get; set; } 

    [XmlElement("Description")] 
    public string Description { get; set; } 

    //[XmlArrayItem("Field", typeof(Field))] 
    //public List<Field> Fields { get; set; } 

    [XmlArray(ElementName = "Fields")] 
    [XmlArrayItem("Field", typeof(Field))] 
    public List<Field> Fields { get; set; } 

} 

[Serializable] 
public class Field 
{ 
    [XmlElement("FieldNumber")] 
    public string FieldNumber { get; set; } 

    [XmlElement("Description")] 
    public string Description { get; set; } 

    //[XmlArrayItem("FieldPart", typeof(FieldPart))] 
    //public List<FieldPart> FieldParts { get; set; } 

    [XmlArray(ElementName = "FieldParts")] 
    [XmlArrayItem("FieldPart", typeof(FieldPart))] 
    public List<FieldPart> FieldParts { get; set; } 
} 

[Serializable] 
public class FieldPart 
{ 
    [XmlElement("PartNumber")] 
    public string PartNumber { get; set; } 

    [XmlElement("PartValue")] 
    public string PartValue { get; set; } 
} 

Я пытаюсь десериализации через следующий код

try 
      { 
       XmlSerializer serializer = new 
        XmlSerializer(typeof(TransactionTypesHolder)); 

       // A FileStream is needed to read the XML document. 
       FileStream fs = new FileStream("Xmlfile1.xml", FileMode.Open); 
       XmlReader reader = XmlReader.Create(fs); 

       // Declare an object variable of the type to be deserialized. 
       TransactionTypesHolder i; 

       // Use the Deserialize method to restore the object's state. 
       i = (TransactionTypesHolder)serializer.Deserialize(reader); 
       fs.Close(); 

      } 
      catch (Exception ex) 
      { 


      } 

Но получаю ошибку не ожидается.

Мой XML является

<?xml version="1.0" ?> 
<TransactionTypes> 
    <TransactionType> 
    <Mti>200</Mti> 
    <Description>Debit</Description> 
    <Fields> 
     <Field> 
     <FieldNumber>3</FieldNumber> 
     <Description></Description> 
     <FieldParts> 
      <FieldPart> 
      <PartNumber> 
       1 
      </PartNumber> 
      <PartValue> 
       00 
      </PartValue> 
      <Description></Description> 
      </FieldPart> 
      <FieldPart> 
      <PartNumber> 
       2 
      </PartNumber> 
      <PartValue> 
       00 
      </PartValue> 
      <Description></Description> 
      </FieldPart> 
     </FieldParts> 
     </Field> 
     <Field> 
     <FieldNumber>14</FieldNumber> 
     <Description></Description> 
     <FieldParts> 
      <FieldPart> 
      <PartNumber> 
       1 
      </PartNumber> 
      <PartValue> 
       9911 
      </PartValue> 
      <Description></Description> 
      </FieldPart> 
     </FieldParts> 
     </Field> 
    </Fields> 
    </TransactionType> 
    <TransactionType> 
    <Mti>100</Mti> 
    <Description>Balance</Description> 
    <Fields> 
     <Field> 
     <FieldNumber>3</FieldNumber> 
     <Description></Description> 
     <FieldParts> 
      <FieldPart> 
      <PartNumber> 
       1 
      </PartNumber> 
      <PartValue> 
       31 
      </PartValue> 
      <Description></Description> 
      </FieldPart> 
      <FieldPart> 
      <PartNumber> 
       2 
      </PartNumber> 
      <PartValue> 
       00 
      </PartValue> 
      <Description></Description> 
      </FieldPart>   
     </Field> 
     <Field> 
     <FieldNumber>14</FieldNumber> 
     <Description></Description> 
     <FieldParts> 
      <FieldPart> 
      <PartNumber> 
       1 
      </PartNumber> 
      <PartValue> 
       9911 
      </PartValue> 
      <Description></Description> 
      </FieldPart> 
     </FieldParts> 
     </Field> 
    </Fields> 
    </TransactionType> 
</TransactionTypes> 

ответ

0

Я использовал следующий класс

[XmlRoot("TransactionTypes")] 
    public class TransactionTypes 
    { 
     [XmlElement("TransactionType")] 
     public List<TransactionType> TransactionType { get; set; } 
    } 

вместо TransactionTypesHolder и успешно в состоянии в deserialize xml

0

Это выглядит не так:

[XmlElement("TransactionTypes")] 
    public List<TransactionType> TransactionTypes { get; set; } 

Попробуйте изменить на:

[XmlArray(ElementName="TransactionTypes")] 
    [XmlArrayItem("TransactionType", typeof(TransactionType))] 
    public List<TransactionType> TransactionTypes { get; set; } 

Также изменится:

[XmlArrayItem("Field", typeof(Field))] 
    public List<Field> Fields { get; set; } 

к:

[XmlArray(ElementName="Fields")] 
    [XmlArrayItem("Field", typeof(Field))] 
    public List<Field> Fields { get; set; } 

и то же самое для:

[XmlArrayItem("FieldPart", typeof(FieldPart))] 
    public List<FieldPart> FieldParts { get; set; } 

к:

[XmlArray(ElementName="FieldParts")] 
    [XmlArrayItem("FieldPart", typeof(FieldPart))] 
    public List<FieldPart> FieldParts { get; set; } 
+0

Я изменил его соответствующим образом, но получил такую ​​же ошибку не ожидалось. –

+0

Любая идея, что я делаю неправильно? –

+0

Отсутствие эффекта после изменения атрибута полей и полей. Infact Я успешно десериализую одну запись TransactionType xml в объект TransactionType. Проблема заключается только в заполнении списка –

Смежные вопросы