在DataContractSerializer之后无法访问Element

时间:2009-12-26 17:09:29

标签: xml linq wcf xml-serialization

我有一个简单的对象,我正在尝试使用DataContractSerializer进行序列化。

在我的单元测试中,我正在尝试验证xml包含product / 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元素时,我得到一个Null引用,即使我设置了一个断点,var xml包含:

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

为什么这不起作用的任何想法?在将序列化流添加到XDocument之前,是否需要解析序列化流?

1 个答案:

答案 0 :(得分: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;
}

希望有所帮助!