【问题标题】:referencing another type in xml schema在 xml 模式中引用另一种类型
【发布时间】:2014-01-15 22:20:19
【问题描述】:

xml代码:

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:ns2="urn:uRServerResponse" xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  xmlns:ns1="SBE"  xmlns="http://schemas.xmlsoap.org/wsdl/" >
  <types>
    <xs:schema xmlns="SBE" targetNamespace="SBE">
      <xs:import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
      <xs:complexType name="SBEOrder">
        <xs:sequence>
          <xs:element name="OrderGUID" type="xs:string" />
          <xs:element name="BuyerGUID" type="xs:string" />
          <xs:element name="PONumber" type="xs:string" />
          <xs:element name="Status" type="xs:string" />
          <xs:element name="Date_Submitted" type="xs:dateTime" />
          <xs:element name="Date_Shipped" type="xs:dateTime" />
          <xs:element name="Date_Received" type="xs:dateTime" />
          <xs:element name="ItemCount" type="xs:int" />
          <xs:element name="ActionCount" type="xs:int" />
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    <xs:schema xmlns="urn:uRServerResponse" targetNamespace="urn:uRServerResponse">
      <xs:import namespace="SBE"/>
      <xs:complexType name="TSBEServerResponseBase">
        <xs:sequence>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="TSBEServerResponse">
        <xs:complexContent mixed="false">
          <xs:extension base="ns2:TSBEServerResponseBase">
            <xs:sequence>
              <xs:element name="SBEOrder" type="ns1:SBEOrder"/>
              <xs:element name="ItemClassCount" type="xs:int" />
              <xs:element name="ItemClassHistoryCount" type="xs:int" />
              <xs:element name="ItemClassInfoCount" type="xs:int" />
              <xs:element name="InvoiceCount" type="xs:int" />
            </xs:sequence>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
    </xs:schema>
  </types>
</definitions>

当我验证上述部分时,我得到类型 'SBE:SBEOrder' 未声明。
我在上述声明中遗漏了什么?

【问题讨论】:

    标签: xml web-services wsdl


    【解决方案1】:

    我实际上认为您的问题在于 SOAPENC 架构的导入声明:

    <xs:import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" />
    

    这使第一个架构无效,导致第二个架构无法引用其类型。

    跳过那个 import 语句,你应该没问题。 :)

    编辑:(添加代码)

    <?xml version = "1.0" encoding = "UTF-8"?>
    <definitions xmlns = "http://schemas.xmlsoap.org/wsdl/" xmlns:mime = "http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns1 = "SBE" xmlns:ns2 = "urn:uRServerResponse" xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc = "http://schemas.xmlsoap.org/soap/encoding/" xmlns:xs = "http://www.w3.org/2001/XMLSchema">  
    <types>    
        <xs:schema targetNamespace = "SBE" xmlns = "SBE">      
            <xs:complexType name = "SBEOrder">        
                <xs:sequence>          
                    <xs:element name = "OrderGUID" type = "xs:string"/>          
                    <xs:element name = "BuyerGUID" type = "xs:string"/>          
                    <xs:element name = "PONumber" type = "xs:string"/>          
                    <xs:element name = "Status" type = "xs:string"/>          
                    <xs:element name = "Date_Submitted" type = "xs:dateTime"/>          
                    <xs:element name = "Date_Shipped" type = "xs:dateTime"/>          
                    <xs:element name = "Date_Received" type = "xs:dateTime"/>          
                    <xs:element name = "ItemCount" type = "xs:int"/>          
                    <xs:element name = "ActionCount" type = "xs:int"/>        
                </xs:sequence>      
            </xs:complexType>    
        </xs:schema>    
        <xs:schema targetNamespace = "urn:uRServerResponse" xmlns = "urn:uRServerResponse">      
            <xs:complexType name = "TSBEServerResponseBase">        
                <xs:sequence>        </xs:sequence>      
            </xs:complexType>      
            <xs:complexType name = "TSBEServerResponse">        
                <xs:complexContent mixed = "false">          
                    <xs:extension base = "ns2:TSBEServerResponseBase">            
                        <xs:sequence>              
                            <xs:element name = "SBEOrder" type = "ns1:SBEOrder"/>              
                            <xs:element name = "ItemClassCount" type = "xs:int"/>              
                            <xs:element name = "ItemClassHistoryCount" type = "xs:int"/>              
                            <xs:element name = "ItemClassInfoCount" type = "xs:int"/>              
                            <xs:element name = "InvoiceCount" type = "xs:int"/>            
                        </xs:sequence>          
                    </xs:extension>        
                </xs:complexContent>      
            </xs:complexType>    
        </xs:schema>  
    </types>
    </definitions>
    

    【讨论】:

    • 删除上面的 import 语句没有任何区别。我删除的另一个元素需要 import 语句以简化我的问题。你还有什么建议吗?提前致谢
    • 在 wsdl 中不需要在每个模式中导入命名空间,您可以简单地在定义元素中声明它们。我结束的代码似乎工作正常。 (有关完整的 xml 代码,请参阅我编辑的答案)。如果这仍然不适合你,也许你应该给我你的问题的完整版本。
    • 我理解你的观点并同意。然而,XML 检查器一直在抱怨。我正在使用 Visual Studio 2013。我将您的版本复制到一个新的 XML 文件中,并在末尾添加了 。我收到 2 条警告和 1 条消息警告 10 类型“SBE:SBEOrder”未声明。 XMLFile1.xml 27 9 其他文件 警告 11 命名空间“SBE”不可在此架构中引用。 XMLFile1.xml 27 9 其他文件消息 12 命名空间“SBE”不可在此架构中引用。 XMLFile1.xml 27 9 其他文件
    • 这似乎是 Visual Studio 2013 中的一个错误。如果我将模式 SBE 部分分解为 .xsd 文件,然后使用模式位置导入 SBE,Visual Studio 不会抱怨 SBE:SBEOrder not找到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多