2012-05-22 1 views
2

Я пытаюсь десериализации XML-документ, который выглядит, как этотКак десериализации Xml с корнем, чем несколькими дочерними элементами одного и того же типа

<invoices> 
    <invoice>2848</invoice> 
    <invoice>2849</invoice> 
    <invoice>2850</invoice> 
    <invoice>2851</invoice> 
    <invoice>2852</invoice> 
</invoices> 

в C# объекта, но я не могу заставить его работать. Я использую DataContractSerializer

Это то, что мой класс выглядит следующим образом:

[DataContract(Name = "invoices", Namespace = "")] 
public class Invoices 
{ 
    [DataMember(Name = "invoice")] 
    public Invoice[] InvoiceIds { get; set; } 
} 

[DataContract(Name = "invoice", Namespace = "")] 
public class Invoice 
{ 
    [DataMember(Name = "invoice")] 
    public string Id { get; set; } 
} 

Конечно, это не работает. Я получаю эту ошибку:

{"Error in line 1 position 24. Expecting state 'Element'.. Encountered 'Text' with name '', namespace ''. "} 

Я не контролирую Xml.

+0

Я не на 'DataContractSerializer', но Сериализация любой нормальный класс, он должен быть отмечен как' Сериализуемый() '. Выполняет ли это 'DataContract()'? – jp2code

+0

@ jp2code, 'DataContractSerializer' не нуждается в атрибуте' [Serializable] '. Он может сериализовать типы, отмеченные им, а также с другими ('DataContract',' CollectionDataContract', 'IXmlSerializable' и даже типы, не отмеченные ничем, для которых он использует некоторые соглашения о том, что сериализовать). – carlosfigueira

ответ

4

Try используя [CollectionDataContract] для этого сценария:

public class StackOverflow_10705733 
{ 
    [CollectionDataContract(Name = "invoices", ItemName = "invoice", Namespace = "")] 
    public class Invoices : List<int> 
    { 
     [DataMember(Name = "invoice")] 
     public int[] InvoiceIds { get; set; } 
    } 
    public static void Test() 
    { 
     DataContractSerializer dcs = new DataContractSerializer(typeof(Invoices)); 
     string xml = @"<invoices> 
          <invoice>2848</invoice> 
          <invoice>2849</invoice> 
          <invoice>2850</invoice> 
          <invoice>2851</invoice> 
          <invoice>2852</invoice> 
         </invoices>"; 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)); 
     Invoices value = dcs.ReadObject(ms) as Invoices; 
     Console.WriteLine(string.Join(",", value)); 
    } 
} 
+0

Perfect работал как шарм, спасибо. – Felix

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