代码之家  ›  专栏  ›  技术社区  ›  SteveC

BizTalk生成的XSD无法验证其派生自的XML

  •  1
  • SteveC  · 技术社区  · 15 年前

    我从另一个系统得到了一个XML响应,但没有XSD,所以我使用创建模式选项来生成一个。

    然后,我将XSD添加到我的Biztalk2006r2项目中,并将其“输入实例文件名”属性设置为原始XML消息。

    尝试了“验证实例”选项,但失败了????有几个错误,比如……
    错误bec2004:xsi:type属性值' http://www.w3.org/2001/XMLSchema:int '对元素无效' http://www.aniteps.com/xml/schemas/awm/images4:NumberOfErrors ,可能是因为它不是从架构中的类型有效派生的类型,也可能是因为它阻止了xsi:type派生。

    用于生成XSD的XML如何失败?

    我举的XML示例是…

    <?xml version="1.0" encoding="utf-8"?>
    <ImportIndexDocumentResponse 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://www.aniteps.com/xml/schemas/awm/images4">
      <HasErrors>false</HasErrors>
      <NumberOfErrors xsi:type="xsd:int">0</NumberOfErrors>
      <ErrorDescription xsi:type="xsd:string">No exception ocurred.</ErrorDescription>
      <ErrorNumber xsi:type="xsd:int">0</ErrorNumber>
      <FailedItems>
        <Item>
          <OriginalDataString xsi:type="xsd:string" />
          <ErrorDescription xsi:type="xsd:string" />
        </Item>
      </FailedItems>
      <UniqueDocumentReferences>
        <UniqueDocumentReference>FA40FE</UniqueDocumentReference>
        <UniqueDocumentReference>U55922</UniqueDocumentReference>
      </UniqueDocumentReferences>
    </ImportIndexDocumentResponse>
    

    而Biztalk/Visual Studio 2005生成…

    <?xml version="1.0" encoding="utf-8"?>
    <xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                attributeFormDefault="unqualified" 
                elementFormDefault="qualified" 
                targetNamespace="http://www.aniteps.com/xml/schemas/awm/images4">
      <xs:element name="ImportIndexDocumentResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="HasErrors" type="xs:boolean" />
            <xs:element name="NumberOfErrors" type="xs:unsignedByte" />
            <xs:element name="ErrorDescription" type="xs:string" />
            <xs:element name="ErrorNumber" type="xs:unsignedByte" />
            <xs:element name="FailedItems">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Item">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="OriginalDataString" />
                        <xs:element name="ErrorDescription" />
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="UniqueDocumentReferences">
              <xs:complexType>
                <xs:sequence>
                  <xs:element maxOccurs="unbounded" name="UniqueDocumentReference" type="xs:string" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xsd:schema>
    
    1 回复  |  直到 15 年前
        1
  •  4
  •   tomasr    15 年前

    XSD生成器相当愚蠢,没有注意到示例实例文档包含类型注释(xsi:type属性)。因此,它决定<ErrorDescription>应该包含无符号字节,而不是有符号整数,正如类型注释所说。

    那么,会发生什么呢?由于元素有两个不同的类型定义,验证器会变得混乱,那么它应该相信谁呢?您可以尝试更改模式,使类型定义与xsi:type重写匹配,这可能会有所帮助。