2012-07-01 41 views
2

我的XML(我不能改变):反序列化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; } 

,并把国名,“日本”,在Country.Name财产,任何想法?

回答

7

您可以与[XmlText]属性这样的装点你的Country类的Name属性:

[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节点合并为一个复杂类型吗?例如' error',把这两个属性放到一个'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