Ema112 Ответов: 1

Как создать класс модели для упомянутого XML-тега ?


Как создать класс модели для xml-тега. При десериализации получения исключения возникает ошибка в типе reflcetion класса модели.
Мой Xml-файл выглядит следующим образом:
<advice_tags>
  
  <aclassname>SAV1 ACCOUNT</aclassname>
  <blockedbalance>0</blockedbalance>
  <acy>
    <blocked_acy>23</blocked_acy>
    <amount_acy>56</amount_acy>
  </acy>
  
</advice_tags>

Мой класс модели для приведенного выше Xml-тега выглядит следующим образом:
[XmlElement("ACLASSNAME")]
       public string ACLASSNAME { get; set; }
       [XmlElement("BLOCKEDBALANCE")]
       public string BLOCKEDBALANCE { get; set; }


       [XmlArray("ACY")]
       [XmlArrayItem("BLOCKED_ACY")]
       [XmlArrayItem("AMOUNT_ACY")]
       public List<string> ACY { get; set; }


Но я получаю исключение при опреснении того же самого для атрибута XmlArray.
MDL_UBSFile UBSFile = null;
                                  XmlSerializer serializer = new XmlSerializer(typeof(MDL_UBSFile));
                                  reader = new StreamReader(Path.Combine(UBSFilePath, FileName));
                                  dss.ReadXml(reader);
                                  reader.Close();

1 Ответов

Рейтинг:
0

Thomas Nielsen - getCore

Ваш xml становится чувствительным к большим и маленьким буквам, так сказать

<myclass>
   <myproperty>1</myproperty>
</myclass>


не является
public class MyClass{
  public int MyProperty{ get;set;}
}


скорее было бы
public class myclass{
  public int myproperty{ get;set;}
}


Итак, что вам нужно сделать, так это соответствовать тому, как вы его написали

... (обновление решения)...
Поэтому, если это не сработает,я предлагаю пойти другим путем. Сделать первый класс

и, наблюдая за вашим xml, становится ясно, что класс AdviceTag может быть сгенерирован с двумя простыми типами и одним сложным типом под названием Acy с двумя значениями (Blocked и amount), возможно, вот так:

public class AdviceTag
    {
        public string AClassName { get; set; }
        public string BlockedBalance { get; set; }

        public Acy Acy { get; set; }
    }

    public class Acy
    {
        public string Blocked{ get; set; }
        public string Amount { get; set; }
    }


Итак, давайте просто сгенерируем xml, создав экземпляр этого класса, и сериализуем его

var aTag = new AdviceTag { AClassName = "Sav1 Account", BlockedBalance = "0", Acy = new Acy { Amount = "56", Blocked = "23" } };

           var ser = new XmlSerializer(typeof(AdviceTag));

           string filename = Assembly.GetExecutingAssembly().Location;
           int pos = filename.LastIndexOf(@"\");
           filename = filename.Substring(0, pos +1) + "myfile.xml";
           using(var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
           {
               ser.Serialize(fs, aTag);
               fs.Flush();
               fs.Close();
           }


Мы помещаем сериализованный xml-файл в то же место, где выполняется сборка, и вызываем его myfile.xml, тогда это выглядит так:
<?xml version="1.0"?>
<AdviceTag xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <AClassName>Sav1 Account</AClassName>
  <BlockedBalance>0</BlockedBalance>
  <Acy>
    <Blocked>23</Blocked>
    <Amount>56</Amount>
  </Acy>
</AdviceTag>


И в чем же была ошибка?

Ну, ваш xml обозначает сложный тип под названием acy, содержащий два свойства-члена, но вы изо всех сил пытались поместить их в arraylist, где вам это не нужно.


Ema112

Я так и думал. Но все же происходит та же ошибка, о которой говорилось выше.