2012-07-01 48 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