2013-06-04 475 views
1

我正嘗試將xml反序列化爲使用C#的對象。C#將XML反序列化爲對象

這是我的XML。

<Products> 
    <Product> 
    <Name>Test</Name> 
    <Price Amount="12.95">£ 12.95</Price> 
    </Product> 
</Products> 

這是我的代碼。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var filePath = @"C:\Eastpoint\TestApps\TestHunterSuppliers\bin\Debug\Sample.xml"; 
     var reader = new XmlTextReader(filePath); 
     var serializer = new XmlSerializer(typeof(Products)); 
     var products = (Products)serializer.Deserialize(reader); 
     Console.WriteLine(products.Product.Name); 
     Console.WriteLine(products.Product.Price.Amount); 
    } 
} 

public class Products 
{ 
    public Product Product { get; set; } 
} 

public class Product 
{ 
    public string Name { get; set; } 
    public Price Price { get; set; } 
} 

public class Price 
{ 
    public string Amount { get; set; } 
    public string Value { get; set; } 
} 

利用我得到的產品對象,但價格對象的屬性上面的代碼總是反序列化到NULL值。

有人能告訴我我失蹤了什麼。

感謝, 納雷什

回答

6

.NET's XML serializer默認行爲是序列化屬性的XML元素。該屬性的值將成爲屬性對應的XML元素的內部文本。也就是說,如果你的序列化對象將是這樣的:

<Products> 
    <Product> 
    <Name>Test</Name> 
    <Price> 
     <Amount>12.95</Amount> 
     <Value>£ 12.95</Value> 
    </Price> 
    </Product> 
</Products> 

在您的情況,您需要指示串行把Price.Amount爲屬性和寫Price.ValuePrice的內部文本。要做到這一點最簡單的方法是裝飾需要適當[XmlXxx]屬性的非默認序列化的屬性:

... 
[XmlAttribute] 
public string Amount { get ; set ; } 

[XmlText] 
public string Value { get ; set ; } 
... 

順便說一下,如果你的Products應該包含多個產品,則需要修改這樣的代碼:

... 
[XmlElement ("Product")] 
public Product[] All { get ; set ; } 
... 

該屬性指示串行不創建<All>元件以保持單獨的產品的元件。您也可以使用其他收藏品一樣List<Product>,但你應該事先創建他們是這樣的:

... 
[XmlElement ("Product")] 
public readonly List<Product> All = new List<Product>() ; 
... 
+0

感謝您的回覆。 – Naresh

+0

感謝您解釋收集。其實這是我的下一個問題。 – Naresh

+0

是的,我有時候是透視的;) –

0

您可以用FileStream原始測試代碼的工作,

測試代碼示例:

  var filePath = @"C:\Eastpoint\TestApps\TestHunterSuppliers\bin\Debug\Sample.xml"; 
      var serializer = new XmlSerializer(typeof(Products)); 

      //Setting dummy object to create the xml 
      Products myProducts = new Products { Product = new Product { Name = "Papers", Price = new Price { Amount = "10", Value = "20" } } }; 

      var strWrite = new FileStream(filePath, FileMode.Create); 
      serializer.Serialize(strWrite, myProducts); 
      strWrite.Close(); 


      ////////////////////////////// 

      var strRead = new FileStream(filePath, FileMode.Open); 
      var products = (Products)serializer.Deserialize(strRead); 
      strRead.Close(); 

      Console.WriteLine(products.Product.Name); 
      Console.WriteLine(products.Product.Price.Amount); 

並以價格作爲XML文檔中的一個屬性:

 public class Price 
     { 
      [XmlAttribute] 
      public string Amount { get; set; } 
      public string Value { get; set; } 
     }