是什么决定了WCF WSDL中XML属性的顺序?

时间:2015-07-02 22:42:48

标签: .net xml wcf wsdl

之前其他人也提出过类似的问题,我理解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文件?

谢谢。

2 个答案:

答案 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>