2017-05-08 104 views
3

我正在使用asp.net(C#)網站,我想要DeserializeXML字符串使用XmlSerializer類。反序列化XML在C#中的對象XmlRoot不工作

我的模型(cs文件)

[XmlRoot("MedicalClearanceFormRoot")] 
    public class MedicalClearanceViewModel 
    { 


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

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

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

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

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

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

XML字符串

<MedicalClearanceFormRoot> 
    <MedicalClearanceForm PassengerName="AAAAAAAAAAAAA" Age="11" PhoneNo="TTTTTTTTTTT" Email="ZZZZZZZZZZZZZZZZZZZ" BookingRefNo="11111111111111111111" /> 
</MedicalClearanceFormRoot> 

代碼以反序列化的XML對象

string myXMLStringFromDB = GetXMLStringFromDb(); // this method will return XML from db. 

    XmlSerializer serializer = new XmlSerializer(typeof(MedicalClearanceViewModel)); 
       using (TextReader reader = new StringReader(myXMLStringFromDB)) 
       { 
       MedicalClearanceViewModel objModel = (MedicalClearanceViewModel)serializer.Deserialize(reader); 
       } 

不過,問題是,當我反序列化XML使用上面的代碼...的屬性,如PassengerNameAge反對,PhoneNo等等仍是空白的objModel

能有人能幫助我來設置適當的XML我的課堂上的符號可以有人可以幫助我解決這個問題。

任何幫助將不勝感激! 謝謝

+0

的屬性爲null,因爲''沒有在XML聲明的任何屬性。您的層次結構在XML和類代碼之間關閉。 –

+0

不應該MedicalClearanceViewModel類有一個MedicalClearanceForm屬性和MedicalClearanceForm具有當前在MedicalClearanceViewModel類中聲明的所有屬性? –

回答

2

你的XML定義的方式,你需要有兩個對象定義: - 一個用於MedicalClearanceFormRoot XML節點 - 一個用於MedicalClearanceForm XML節點

所以,你有兩條路你可以採取:添加包裝類或更改您的XML。

要添加包裝類,您需要有一個類來表示MedicalClearanceFormRoot,該類具有MedicalClearanceForm對象的屬性。然後將您的序列化程序類更改爲包裝類。這裏有一個例子:

[XmlRoot("MedicalClearanceFormRoot")] 
public class Wrapper 
{ 
    public MedicalClearanceViewModel MedicalClearanceForm { get; set;} 
} 

public class MedicalClearanceViewModel 
{ 

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

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

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

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

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

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


     XmlSerializer serializer = new XmlSerializer(typeof(Wrapper)); 
     using (TextReader reader = new StringReader(myXMLStringFromDB)) 
     { 
      Wrapper objModel = (Wrapper)serializer.Deserialize(reader); 
     } 

選項2:更改您的XML看起來像這樣:

<MedicalClearanceFormRoot PassengerName="AAAAAAAAAAAAA" Age="11" PhoneNo="TTTTTTTTTTT" Email="ZZZZZZZZZZZZZZZZZZZ" BookingRefNo="11111111111111111111" > 
</MedicalClearanceFormRoot> 
+0

謝謝,選項1適合我! 'class Wrapper' ... 再次感謝...... – prog1011

1

爲了符合指定的XML,你需要這個類結構我相信。

[XmlRoot("MedicalClearanceFormRoot")] 
public class MedicalClearanceViewModel 
{ 
    public MedicalClearanceFormElement MedicalClearanceForm { get; set; } 
} 

[XmlElement] 
public class MedicalClearanceFormElement 
{ 
    [XmlAttribute("PassengerName")] 
    public string PassengerName { get; set; } 

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

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

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

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

    [XmlAttribute("BookingRefNo")] 
    public string BookingRefNo { get; set; } 
} 
+0

我們不能在類上應用''[XmlElement]'。 – prog1011

+0

@Prog ...爲什麼不呢? –

1

我創建了一個示例,代碼將如下所示。你的模型不正確。

public class MedicalClearanceForm 
{ 
    [XmlAttribute("PassengerName")] 
    public string PassengerName { get; set; } 

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

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

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

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

    [XmlAttribute("BookingRefNo")] 
    public string BookingRefNo { get; set; } 
} 
[XmlRoot("MedicalClearanceFormRoot")] 
public class MedicalClearanceFormRoot 
{ 


    [XmlElement("MedicalClearanceForm")] 
    public MedicalClearanceForm MedicalClearanceForm { get; set; } 


} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string myXMLStringFromDB = @"<MedicalClearanceFormRoot><MedicalClearanceForm PassengerName = 'AAAAAAAAAAAAA' Age = '11' PhoneNo = 'TTTTTTTTTTT' Email = 'ZZZZZZZZZZZZZZZZZZZ' BookingRefNo = '11111111111111111111' /></MedicalClearanceFormRoot >"; 

     XmlSerializer serializer = new XmlSerializer(typeof(MedicalClearanceFormRoot)); 
     using (TextReader reader = new StringReader(myXMLStringFromDB)) 
     { 
      MedicalClearanceFormRoot objModel = (MedicalClearanceFormRoot)serializer.Deserialize(reader); 
     } 

    } 
}