2009-12-26 74 views
0

我有一個簡單的對象,我試圖使用DataContractSerializer進行序列化。DataContractSerializer後無法訪問元素

在我的單元測試中,我試圖驗證xml是否包含產品/ sku節點的正確值。

我的產品類別:

[DataContract(Namespace = "http://foo.com/catalogue/") 
partial class Product 
{ 
    [DataMember(Name = "sku")] 
    public virtual string ProductSKU 
    { 
     get { return _productSKU; } 
     set 
     { 
     OnProductSKUChanging(); 
     _productSKU = value; 
     OnProductSKUChanged(); 
     } 
    } 
} 

這裏的方法我測試:

public XDocument GetProductXML(Product product) 
    { 
     var serializer = new DataContractSerializer(typeof(Product)); 
     var document = new XDocument(); 

     using (var writer = document.CreateWriter()) 
     { 
      serializer.WriteObject(writer, product); 
      writer.Close(); 
     } 

     return document; 
    } 

這是我的單元測試:

[Test] 
    public void Can_get_product_xml() 
    { 
     // Arrange 
     var product = new Product {Id = 1, Name = "Foo Balls", ProductSKU = "Foo123"}; 
     var repository = new CatalogueRepository(); 
     var expectedProductSKU = "Foo123"; 

     // Act 
     var xml = repository.GetProductXML(product); 
     var actualProductSKU = xml.Element("product").Element("sku").Value; 

     // Assert 
     Assert.AreEqual(expectedProductSKU, actualProductSKU); 
    } 

的問題是,我得到一個當我嘗試訪問xml元素時引用空引用,儘管當我設置了一個斷點時,var xml包含:

<product xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://foo.com catalogue/"> 
    <sku>Foo123</sku> 
</product> 

任何想法爲什麼這不起作用?在將其添加到XDocument之前,是否需要解析序列化的流?

回答

1

我認爲問題在於你的XML文檔有一個XML名稱空間xmlns="http://foo.com catalogue/",但是當你選擇使用Linq-to-XML時,你永遠不會以任何方式,形狀或形式使用該名稱空間。

此外,<product>標記是您的XML根標記 - 您不能將其作爲元素引用。

嘗試這樣:

XNamespace ns = "http://foo.com/catalogue/"; 

var root = xml.Root; 
var sku = root.Element(xns + "sku").Value; 

如果你想確保,首先分配.Element()一個變量,並且檢查!= null

var sku = root.Element(xns + "sku"); 
if(sku != null) 
{ 
    var skuValue = first.Value; 
} 

希望有點幫助!

+0

啊,我認爲這可能是與命名空間有關...將嘗試 – autonomatt 2009-12-26 17:19:53

+1

哦,是的,這工作。乾杯馬克! – autonomatt 2009-12-26 17:30:12

+0

太棒了!很高興知道它有幫助。請享用! – 2009-12-26 17:31:00