【问题标题】:How to instantiate an XSD Element of an abstract type如何实例化抽象类型的 XSD 元素
【发布时间】:2013-05-19 02:52:36
【问题描述】:

我是一名 Java 程序员,不熟悉 XML 和 Web 服务。我正在尝试创建一个符合包含以下 sn-p 的 XSD(我没有编写)的 xml 文档。我想做的是调用这个网络服务来复制邮件。有一个名为 copy 的元素,它是抽象类型“tns:CopyRequest”。由于元素的类型是抽象的,Eclipse 告诉我我不能创建一个。有一个 CopyMailingRequest 类型(听起来像是我想要的),但我不确定如何实例化它,因为没有扩展该类型的元素。我错过了什么?

<xs:element name="copy" nillable="true" type="tns:CopyRequest"/>

<xs:complexType name="CopyMailingRequest">
  <xs:complexContent>
    <xs:extension base="tns:CopyRequest">
      <xs:sequence>
        <xs:element name="fromId" type="tns:MailingId"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="StandardMailingId">
  <xs:complexContent>
    <xs:extension base="tns:MailingId"/>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="MailingId">
  <xs:complexContent>
    <xs:extension base="tns:ObjectId"/>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="CopyRequest" abstract="true">
  <xs:sequence>
    <xs:element name="newName" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    为了更容易理解,下面是一个经过最少修改的架构(添加了带有任意 targetNamespace 的架构元素,并为 ObjectId 添加了一个虚拟定义):

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
    <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns:tns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="copy" nillable="true" type="tns:CopyRequest"/>
    
        <xs:complexType name="CopyMailingRequest">
            <xs:complexContent>
                <xs:extension base="tns:CopyRequest">
                    <xs:sequence>
                        <xs:element name="fromId" type="tns:MailingId"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    
        <xs:complexType name="StandardMailingId">
            <xs:complexContent>
                <xs:extension base="tns:MailingId"/>
            </xs:complexContent>
        </xs:complexType>
    
        <xs:complexType name="MailingId">
            <xs:complexContent>
                <xs:extension base="tns:ObjectId"/>
            </xs:complexContent>
        </xs:complexType>
    
        <xs:complexType name="ObjectId"/>
    
        <xs:complexType name="CopyRequest" abstract="true">
            <xs:sequence>
                <xs:element name="newName" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:schema>
    

    这是自动(且有效)生成的 XSD 示例 XML 的样子:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
    <copy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CopyMailingRequest" xmlns="http://tempuri.org/XMLSchema.xsd">
        <newName>newName1</newName>
        <fromId/>
    </copy>
    

    这里的重点是xsi:type="CopyMailingRequest";这就是您在场景中提供具体类型的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多