之前其他人也提出过类似的问题,我理解XML属性的顺序不能在XML或模式中指定。但是,我想知道,WSDL中XML属性的顺序是由WCF随机生成还是遵循一些规则。
例如,在一个阶段,我们在生成的WSDL中有以下(部分)XML标记。
<xs:element maxOccurs="unbounded" minOccurs="0"
现在再次生成它就变成了
<xs:element minOccurs="0" maxOccurs="unbounded"
以最小和最大交换顺序。
另一个例子:
<wsdl:port binding="tns:BasicHttpBinding_IReferenceDataBusinessService" name="BasicHttpBinding_IReferenceDataBusinessService">
变为
<wsdl:port name="BasicHttpBinding_IReferenceDataBusinessService" binding="tns:BasicHttpBinding_IReferenceDataBusinessService">
只是想知道在WCF中决定这样的订单是什么?是否可以调整流程以保持相同的顺序,以便更容易比较两个WSDL文件?
谢谢。
答案 0 :(得分:0)
您承认属性顺序无关紧要,然后继续暗示您希望对属性顺序采取行动。根据定义,它是一个实现细节。依靠任何给定的属性排序自担风险。
此外,属性顺序只是词法上比较XML文档的众多障碍之一。在您开始这样的努力之前,请熟悉Canonical XML Version 1.1所涵盖的所有内容。以下是摘要:
XML文档的规范形式是物理表示 通过本说明书中描述的方法产生的文件。 这些更改总结在以下列表中:
- 文档以UTF-8
编码- 在解析
之前,在输入上标准化为#xA的换行符- 属性值被规范化,就像通过验证处理器一样
- 替换字符和已解析的实体引用
- CDATA部分将替换为其字符内容
- 删除了XML声明和文档类型声明
- 将空元素转换为起始标记对
- 文档元素之外以及开始和结束标记内的空格是标准化的
- 保留字符内容中的所有空格(不包括换行规范化期间删除的字符)
- 属性值分隔符设置为引号(双引号)
- 属性值和字符内容中的特殊字符将替换为字符引用
- 从每个元素中删除多余的名称空间声明
- 默认属性添加到每个元素
- 执行xml:基本属性[C14N-Issues]的修复
- 对每个元素的名称空间声明和属性强加了字典顺序
强大的代码不依赖于任何这些维度上的实现的偶然(非必要)属性。
答案 1 :(得分:0)
最后我决定使用Xml Sorter(https://xmlsorter.codeplex.com/)。在比较之前对WSDL XML文件进行排序,这样我就可以立即发现BeyondCompare中两个WSDL文件之间的差异,而不是慢慢向下滚动并尝试发现数百个差异的真正差异(由于更改的XML属性顺序)。 / p>