java - XSD 多态性不适用于 JAXP?

标签 java xml xsd

我有一个像这样的 XML:

<members>
  <member>
    <name>john</name>
    <properties>
      <age>20</age>
      <address>20</address>
   </properties>
  </member>
  <member>
    <name>kayla</name>
    <properties>
      <gender>female</gender>
      <address>20</address>
   </properties>
  </member>
</members>

这里会有多个成员节点,它们都共享一个 <name>节点和 properties节点。然而, properties 中的元素不同,或者 age+addressgender+address都是有效的选择。

我尝试编写这样的 XSD:

    <?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="members" type="membersType"/>
  <xs:complexType name="membersType">
    <xs:sequence>
      <xs:element type="memberType" name="member" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="memberType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element type="propertiesType" name="properties"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="propertiesType">
    <xs:sequence>
      <xs:element type="xs:string" name="address"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="propertiesTypeA">
    <xs:complexContent>
      <xs:extension base="propertiesType">
        <xs:sequence>
          <xs:element type="xs:string" name="age" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="propertiesTypeB">
    <xs:complexContent>
      <xs:extension base="propertiesType">
        <xs:sequence>
          <xs:element type="xs:string" name="gender" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

</xs:schema>

我希望这里可以有类似多态性的东西,但是当我使用 JAXP 进行验证时,这不起作用。 我还尝试使用 group功能,但有一个相同的 address 2 组中的元素,因此它仍然不可用。

那么,我应该如何设计XSD?

最佳答案

您当前的 XML 架构

按照您的 XML 架构,您的 XML 需要如下所示:

<members xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <member>
    <name>john</name>
    <properties xsi:type="propertiesTypeA">
      <address>20</address>
      <age>20</age>
   </properties>
  </member>
  <member>
    <name>kayla</name>
    <properties xsi:type="propertiesTypeB">
      <address>20</address>
      <gender>female</gender>
   </properties>
  </member>
</members>

注意以下事项:

  • 继承的属性需要首先出现。
  • 您需要使用 xsi:type 属性将元素类型覆盖为子类型。
<小时/>

您可能想要什么

在 XML 架构中指定“选择”可能更适合您。您将不再需要子类型。

  <xs:complexType name="propertiesType">
    <xs:sequence>
      <xs:choice>
       <xs:element type="xs:string" name="age"/>
       <xs:element type="xs:string" name="gender"/>
      </xs:choice>
      <xs:element type="xs:string" name="address"/>
    </xs:sequence>
  </xs:complexType>

关于java - XSD 多态性不适用于 JAXP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28090792/

相关文章:

Java数据建模: Use Map or List to build one to many relationship

c# - 如何以编程方式从 XSD 生成 .NET 类? (就像 xsd.exe 一样)

xml - ENAMETOOLONG 请求 xml 文档

java - 如何将多个 XSD 文件合并为一个 XSD 文件?

xml - 在本地托管 W3 XML 架构文件

java - 使用 Spring Data MongoDB 在应用程序启动时加载初始数据

java - 有没有办法扫描 JPA 实体而不在 persistence.xml 文件中声明持久类?

java - 将对象写入 Gemfire 缓存中的键

xml - 使用 XSL 保持运行总计

xml - 尝试获取XML元素