2012-07-01 2 views
2

Мой Xml (который я не могу изменить):Deserialize XML строка сложного типа

<result> 
    <type>MAZDA</type> 
    <make>RX-8</type> 
    <country>JAPAN</country> 
</result> 

Моя модель:

[Serializable, XmlRoot("result")] 
public class VehicleDetails 
{ 
    public string Type { get; set; } 
    public string Make { get; set; } 
    public string Country { get; set; } 
} 

десериализацией этот XML работает, как ожидалось, но я хочу, чтобы изменить Country свойство сложного типа, например, так:

public Country Country { get; set; } 

и поставить название страны, «JAPAN», в Country.Name недвижимость, любые идеи?

ответ

7

Вы можете украсить Name свойство вашего Country класса с атрибутом [XmlText], как это:

[XmlRoot("result")] 
public class VehicleDetails 
{ 
    public string Type { get; set; } 
    public string Make { get; set; } 
    public Country Country { get; set; } 
} 

public class Country 
{ 
    [XmlText] 
    public string Name { get; set; } 
} 

заметить также, что я избавилась от атрибута [Serializable]. Это бесполезно для сериализации XML. Этот атрибут используется для двоичной/удаленной сериализации.

А вот полный пример, который будет печатать JAPAN, как и ожидалось:

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

[XmlRoot("result")] 
public class VehicleDetails 
{ 
    public string Type { get; set; } 
    public string Make { get; set; } 
    public Country Country { get; set; } 
} 

public class Country 
{ 
    [XmlText] 
    public string Name { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var serializer = new XmlSerializer(typeof(VehicleDetails)); 
     var xml = 
     @"<result> 
      <Type>MAZDA</Type> 
      <Make>RX-8</Make> 
      <Country>JAPAN</Country> 
     </result>"; 
     using (var reader = new StringReader(xml)) 
     using (var xmlReader = XmlReader.Create(reader)) 
     { 
      var result = (VehicleDetails)serializer.Deserialize(xmlReader); 
      Console.WriteLine(result.Country.Name); 
     } 
    } 
} 
+0

Благодаря Дарин, отлично работает. Могу ли я объединить два XML-узла в один сложный тип? например ' Ошибка ошибки ', поместите эти два свойства в одну 'public Error Error {get; задавать; } ', где тип' Error' имеет два свойства: 'code' и' message'? – eth0

0

Вот VB 2010 эквивалент ...

Imports System.IO 
Imports System.Xml 
Imports System.Xml.Serialization 

Public Module Module1 

    Public Sub Main() 
     Dim serializer = New XmlSerializer(GetType(VehicleDetails)) 
     Dim xml = "<result>    <Type>MAZDA</Type>    <Make>RX-8</Make>    <Country>JAPAN</Country>   </result>" 

     Using reader = New StringReader(xml) 
      Using xmlReader__1 = XmlReader.Create(reader) 
       Dim result = DirectCast(serializer.Deserialize(xmlReader__1), VehicleDetails) 
       Console.WriteLine(result.Country.Name) 
      End Using 
     End Using 
    End Sub 

    <XmlRoot("result")> _ 
    Public Class VehicleDetails 

     Public Property Type() As String 
      Get 
       Return m_Type 
      End Get 
      Set(value As String) 
       m_Type = value 
      End Set 
     End Property 
     Private m_Type As String 


     Public Property Make() As String 
      Get 
       Return m_Make 
      End Get 
      Set(value As String) 
       m_Make = value 
      End Set 
     End Property 
     Private m_Make As String 
     Public Property Country() As Country 
      Get 
       Return m_Country 
      End Get 
      Set(value As Country) 
       m_Country = value 
      End Set 
     End Property 
     Private m_Country As Country 

    End Class 
    Public Class Country 
     <XmlText()> _ 
     Public Property Name() As String 
      Get 
       Return m_Name 
      End Get 
      Set(value As String) 
       m_Name = value 
      End Set 
     End Property 
     Private m_Name As String 
    End Class 

End Module 
+0

Проблема в том, что я хотел бы иметь возможность делать это на лету, а не жестко кодировать все перед рукой. Хотелось бы иметь возможность вызывать функцию с объектом XML в качестве параметра и возвращать объект или иметь сам объект XML, как у нас есть. Не имея возможности создавать свойства из строк, обнаруженных во время выполнения, я не могу выполнить эту функцию. :( – newby

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