我有一个简单的对象,我正在尝试使用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之前,是否需要解析序列化流?
答案 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;
}
希望有所帮助!