2

我的一位同事遇到了XMLSerializer通过 MSTest Runner 或 NCrunch 运行时行为不同的情况。

通过 N-Crunch 运行测试时,输出包含

xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

通过 MSTest Runner 运行时,输出包含

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xsi和的顺序xsd不同。其余的输出是一样的。

这可能是什么原因?

我们不使用<system.xml.serialization>配置中的任何设置。

4

2 回答 2

4

我无法回答你原来的问题,我发现这个问题是因为我们在 MsTest 和 NUnit 上存在完全相同的问题,但我可以为遇到这种情况的其他人推荐一个有效的解决方法。这是使用 XML 规范化,例如:

using System.Security.Cryptography.Xml;

string canonicaliseXml(string xmlInput)
{
    XmlDocument myDoc = new XmlDocument();
    myDoc.LoadXml(xmlInput);
    XmlDsigC14NTransform t = new XmlDsigC14NTransform();
    t.LoadInput (myDoc);
    var ms = (MemoryStream)t.GetOutput();
    return Encoding.UTF8.GetString(ms.ToArray());
}

XML 规范化通过删除元素之间的空格、按字母顺序排列属性和扩展短格式空元素(在http://en.wikipedia.org/wiki/Canonical_XML上有一个有用的解释)等步骤来规范化 XML 字符串,以便:

<root x='x'  a='a'>  <trunk>etc</trunk> <empty />  </root> 

将被规范化为

<root a="a" x="x"><trunk>etc</trunk><empty></empty></root> 

显然,这将解决 xsd 和 xsi 命名空间声明的顺序上的任何差异,正如我们和原始发布者所经历的那样。

编辑如果您想采用带大括号的方法,您可以将其与http://silent-code.blogspot.co.uk/2009/09/using-xmlserializer-中的“新 XmlSerializerNamespaces()”技术结合使用without-rendering.html,它从初始序列化中过滤掉多余的 xsd 和 xsi 命名空间声明。

于 2013-07-12T08:38:26.650 回答
3

假设 NCrunch 和 NUnit 的工作方式相同,之所以存在差异,是因为 MS Test 运行的是 32 位版本的 XmlSerializer,而 NCrunch 运行的是 64 位版本。为了使 NCrunch 以与 MS Test 相同的方式工作,您可以将 x86 指定为 NCrunch 测试项目的平台目标。

从技术上讲,两个版本的 XML 完全相同,顺序无关紧要,因此在测试您的 XML 是否正确时,Francis 的解决方法是有意义的。

于 2013-07-15T08:28:51.337 回答