2015-12-17 3 views
2

У меня есть XML:C# XML десериализации с пространством имен

<?xml version="1.0" encoding="UTF-8"?> 
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
    <gesmes:subject>Reference rates</gesmes:subject> 
    <gesmes:Sender> 
     <gesmes:name>European Central Bank</gesmes:name> 
    </gesmes:Sender> 
    <Cube> 
     <Cube time='2015-12-16'> 
      <Cube currency='USD' rate='1.0933'/> 
      <Cube currency='JPY' rate='133.18'/> 
     </Cube> 
    </Cube> 
</gesmes:Envelope> 

, который я пытаюсь десериализации с:

[XmlRoot("Envelope", Namespace = EcbNameSpace)] 
public class EcbEnvelope 
{ 
    const string EcbNameSpace = "http://www.gesmes.org/xml/2002-08-01"; 

    [XmlElement("Sender", Namespace = EcbNameSpace)] 
    public string EcbSender { get; set; } 

    [XmlElement("subject", Namespace = EcbNameSpace)] 
    public string EcbSubject { get; set; } 

    [XmlArray("Cube")] 
    [XmlArrayItem("Cube")] 
    public List<CubeRoot> CubeRootEl { get; set; } 

    public class CubeRoot 
    { 
     [XmlAttribute("time")] 
     public string Time { get; set; } 

     [XmlElement("Cube")] 
     public List<CubeItem> CubeItems { get; set; } 

     public class CubeItem 
     { 
      [XmlAttribute("rate")] 
      public string RateStr { get; set; } 

      [XmlIgnore] 
      public decimal Rate 
      { 
       get { return decimal.Parse(RateStr); } 
      } 

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

Однако Десериализует CubeRootEl, как пустой список. Если я удалю пробелы из XML, то он успешно десериализуется. Что я делаю не так? Я попытался добавить пустые пространства имен в CubeRootEl в коде, но также безуспешно.

Вот код, используемый для десериализации:

var serializer = new XmlSerializer(typeof(EcbEnvelope)); 
using (var streamReader = new StreamReader(pathToFile)) 
    var a = serializer.Deserialize(streamReader) as EcbEnvelope; 
} 
+0

Какой код вы используете для десериализации? –

+0

var serializer = новый XmlSerializer (typeof (EcbEnvelope)); с использованием (var streamReader = new StreamReader (pathToFile)) { var a = serializer.Deserialize (streamReader) как EcbEnvelope; } – Luka

ответ

1

У вас есть несколько вопросов:

  1. Вы не указать пространство имен для свойства public List<CubeRoot> CubeRootEl. Если пространство имен для свойства не указано, XmlSerializerпредполагает, что он находится в том же пространстве имен, что и содержащий элемент, который в этом случае должен быть . Но элементы <Cube> не находятся в этом пространстве имен, так как они не имеют префикса "gesmes:".

  2. Ваш XML имеет объявление пространства имен по умолчанию xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref". Таким образом, элементы <Cube> фактически находятся в этом пространстве имен.

  3. Sender не является простым строкозначным элементом, он имеет вложенный элемент <gesmes:name>European Central Bank</gesmes:name>.

Фиксация эти три вопроса позволяет вашему XML быть десериализован:

[XmlRoot("Envelope", Namespace = GesmesNameSpace)] 
public class EcbEnvelope 
{ 
    public const string GesmesNameSpace = "http://www.gesmes.org/xml/2002-08-01"; 
    public const string EcbNameSpace = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"; 

    [XmlElement("Sender", Namespace = GesmesNameSpace)] 
    public EcbSender Sender { get; set; } 

    [XmlElement("subject", Namespace = GesmesNameSpace)] 
    public string EcbSubject { get; set; } 

    [XmlArray("Cube", Namespace = EcbNameSpace)] 
    [XmlArrayItem("Cube")] 
    public List<CubeRoot> CubeRootEl { get; set; } 

    public class EcbSender 
    { 
     [XmlElement("name")] 
     public string Name { get; set; } 
    } 

    public class CubeRoot 
    { 
     [XmlAttribute("time")] 
     public string Time { get; set; } 

     [XmlElement("Cube")] 
     public List<CubeItem> CubeItems { get; set; } 

     public class CubeItem 
     { 
      [XmlAttribute("rate")] 
      public string RateStr { get; set; } 

      [XmlIgnore] 
      public decimal Rate 
      { 
       get { return decimal.Parse(RateStr); } 
      } 

      [XmlAttribute("currency")] 
      public string Currency { get; set; } 
     } 
    } 
} 
Смежные вопросы