2015-04-16 5 views
-1

У меня есть файл XML, как этот пример:XML в C#: Десериализация

<?xml version="1.0"?> 
<ArrayOfBloc xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Bloc> 
    <table> 
     <name>OM_MUSER</name> 
    </table> 
    <listColumn> 
     <Column> 
      <name>CODE_USER</name> 
      <value>SUPER</value> 
      <type>VARCHAR</type> 
      <pk>1</pk> 
     </Column> 
     <Column> 
      <name>ID_MPERSONNE</name> 
      <value>1</value> 
      <type>INT</type> 
     </Column> 
     <Column> 
      <name>PASSWORD_USER</name> 
      <value>TESTJPA</value> 
      <type>VARCHAR</type> 
     </Column> 
    </listColumn> 
</Bloc> 
<!-- ... --> 
</ArrayOfBloc> 

И я могу десериализацию этого с помощью этого:

class XmlManager 
{ 
    public static List<Bloc> ReadXML(string path) 
    { 
     System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(List<Bloc>)); 
     System.IO.StreamReader file = new System.IO.StreamReader(path); 
     List<Bloc> listB = new List<Bloc>(); 
     listB = (List<Bloc>)reader.Deserialize(file); 
     file.Close(); 
     return listB; 
    } 
} 

public class Bloc 
{ 
    public Table table { get; set; } 
    public List<Column> listColumn { get; set; } 

    public Bloc() 
    { 
     table = new Table(); 
     listColumn = new List<Column>(); 
    } 
} 

public class Table 
{ 
    public string name { get; set; } 
    public List<Column> listColumn { get; set; } 

    public Table() { listColumn = new List<Column>(); } 
} 

public class Column 
{ 
    public string name { get; set; } 
    public string value { get; set; } 
    public string type { get; set; } 
    public int pk { get; set; } 
    public string defaultValue { get; set; } 
    public int nullable { get; set; } 

    public Column() { } 
} 

Но если я десериализация следующего примера XML с тем же C# код, он не работает, и я не знаю, почему ...

<?xml version="1.0"?> 
<ArrayOfBloc xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Bloc> 
    <table name="OM_MUSER"/> 
    <listColumn> 
     <Column name="CODE_USER" value="SUPER" type="VARCHAR" pk="1"/> 
     <Column name="ID_MPERSONNE" value="1" type="INT"/> 
     <Column name="PASSWORD_USER" value="TESTJPA" type="VARCHAR"/> 
    </listColumn> 
</Bloc> 
<!-- ... --> 
</ArrayOfBloc> 

вы знаете, что требуется сделать, пожалуйста?
Большое спасибо за вашу помощь!

+2

"Не работает" не достаточно конкретны. Добавьте либо (1) полное сообщение об ошибке, которое вы получите, и где оно выбрано, и/или (2) ожидаемый результат по сравнению с вашим наблюдаемым результатом. – Alex

ответ

3

Попробуйте это:

[XmlRoot("ArrayOfBloc")] 
public class BlocContainer 
{ 
    [XmlElement("Bloc")] 
    public List<Bloc> BlocCollection { get; set; } 
} 


public class Table 
{ 
    [XmlAttribute("name")] 
    public string name { get; set; } 

    public List<Column> listColumn { get; set; } 

    public Table() { listColumn = new List<Column>(); } 
} 

public class Column 
{ 
    [XmlAttribute("name")] 
    public string name { get; set; } 

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

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

    [XmlAttribute("pk")] 
    public int pk { get; set; } 

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

    [XmlAttribute("nullable")] 
    public int nullable { get; set; } 

    public Column() { } 
} 

десериализации в BlocContainer

public static List<Bloc> ReadXML(string path) 
{ 
    System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(BlocContainer)); 
    System.IO.StreamReader file = new System.IO.StreamReader(path); 
    BlocContainer bc = null; 
    bc = (BlocContainer)reader.Deserialize(file); 
    file.Close(); 
    if(bc != null) { return bc.BlocCollection; } else { return new List<Bloc>(); } 
} 
+1

Спасибо, он работает с хорошими аннотациями :) –

+0

@ user3811647 Я добавил немного больше, поскольку вы не использовали атрибут '[XmlAttribute (...)]', чтобы объявлять источник значений в качестве атрибутов. – john

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