2015-01-28 4 views
2

Мне нужно десериализовать следующий образец XML, и после того, как я пробовал весь день, мне не удалось.Deserialize массив с элементами, имеющими имена переменных

Проблема в том, что имена элементов различны, хотя они относятся к одному и тому же прототипу.

Какой был бы лучший подход?

<Test Name="SomeName"> 
    <OBJECTS NbObjects="2"> 
     <OBJECT0 ObjectName="ObjName1"> 
      <COMMAND NbCommand="3"> 
       <COMMAND0 CommandLabel="Command_A" CommandFileName="File1"/> 
       <COMMAND1 CommandLabel="Command_B" CommandFileName="File2"/> 
       <COMMAND2 CommandLabel="Command_C" CommandFileName="File3"/> 
      </COMMAND> 
     </OBJECT0> 
     <OBJECT1 ObjectName="ObjName2"> 
      <COMMAND NbCommand="8"> 
       <COMMAND0 CommandLabel="MyCommand1" CommandFileName="File1"/> 
       <COMMAND1 CommandLabel="MyCommand2" CommandFileName="File2"/> 
       <COMMAND2 CommandLabel="MyCommand3" CommandFileName="File3"/> 
       <COMMAND3 CommandLabel="MyCommand4" CommandFileName="File4"/> 
       <COMMAND4 CommandLabel="MyCommand5" CommandFileName="File5"/> 
       <COMMAND5 CommandLabel="MyCommand6" CommandFileName="File6"/> 
       <COMMAND6 CommandLabel="MyCommand7" CommandFileName="File7"/> 
       <COMMAND7 CommandLabel="MyCommand8" CommandFileName="File8"/> 
      </COMMAND> 
     </OBJECT1> 
    </OBJECTS> 
</Test> 

Это C# код, который я пытаюсь не повезло:

using System.Collections.Generic; 
using System.IO; 
using System.Xml.Serialization; 

namespace XMLtest 
{ 
    [XmlRoot("Test")] 
    public class Test 
    { 
     [XmlAttribute("Name")] 
     public string Name { get; set; } 
     [XmlElement("OBJECTS")] 
     public Objects objects { get; set; } 

     public void Load(string filename) 
     { 
      XmlSerializer xs = new XmlSerializer(typeof (Test)); 
      using (StreamReader rd = new StreamReader(filename)) 
      { 
       Test test = xs.Deserialize(rd) as Test; 
      } 
     } 
    } 

    public class Objects 
    { 
     [XmlAttribute("NbObjects")] 
     public int NbObjects { get; set; } 
     [XmlArray] 
     [XmlArrayItem(typeof(Object))] 
     public List<Object> ObjectList { get; set; } 

     public Objects() 
     { 
      ObjectList = new List<Object>(); 
     } 
    } 

    public class Object 
    { 
     [XmlAttribute("ObjectName")] 
     public string ObjectName { get; set; } 

     [XmlElement("COMMAND")] 
     public Commands Cmds { get; set; } 
    } 

    public class Commands 
    { 
     [XmlAttribute("NbCommand")] 
     public int NbCommand { get; set; } 

     [XmlArray("COMMAND")] 
     [XmlArrayItem("COMMAND")] 
     public List<Command> CommandList { get; set; } 

     public Commands() 
     { 
      CommandList = new List<Command>(); 
     } 
    } 

    public class Command 
    { 
     [XmlAttribute("CommandLabel")] 
     public string CommandLabel { get; set; } 

     [XmlAttribute("CommandFileName")] 
     public string CommandFileName { get; set; } 
    } 
} 

ответ

2

Мой совет был бы не использовать <OBJECT0 ... >, <OBJECT1 ... > или <COMMAND0 ... >, <COMMAND1 ... > и так далее. Это разные теги, означающие разные предметы/объекты.

Если номер важен для вас, измените его на <OBJECT id='0' name='...'> ... </OBJECT> и <COMMAND id='0' label='...' filename='...' > ... </COMMAND>. Это даст вам возможность сортировать или идентифицировать их по id, и все теги одного типа.

+1

Спасибо, что нашли время ответить. Но я не создал этот «плохой» XML, и его нужно разбирать. BTW количество объектов увеличивается до 72! Поэтому я очень хотел бы избежать использования 72 различных классов для десериализации этого. – Seb

+0

Возможно, вы можете проанализировать XML-файл с регулярным выражением и заменить ' 'на' '. После этого полученная XML-строка может быть десериализована в вашу структуру объекта. –

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