XML Schema 复合空元素的概念

复合空元素指在XML中不含子元素或文本内容,但可能包含属性的元素。这类元素通常用于标记或配置场景,例如HTML的<img><br>标签。XML Schema通过complexType定义其结构,允许声明属性但禁止内容。

定义复合空元素的Schema语法

使用xs:complexType结合xs:attribute声明属性,并通过empty内容模型限制元素为空:

<xs:element name="emptyElement">
  <xs:complexType>
    <xs:attribute name="id" type="xs:ID"/>
    <xs:attribute name="status" type="xs:string"/>
  </xs:complexType>
</xs:element>

完整Schema示例

以下Schema定义了一个包含多个复合空元素的模型:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="configuration">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="debugFlag" minOccurs="0"/>
        <xs:element ref="logEvent" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="debugFlag">
    <xs:complexType>
      <xs:attribute name="enable" type="xs:boolean" use="required"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="logEvent">
    <xs:complexType>
      <xs:attribute name="level" type="logLevelType" use="required"/>
      <xs:attribute name="timestamp" type="xs:dateTime"/>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="logLevelType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ERROR"/>
      <xs:enumeration value="WARN"/>
      <xs:enumeration value="INFO"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

对应的XML实例文档

根据上述Schema生成的合规XML实例:

<configuration>
  <debugFlag enable="true"/>
  <logEvent level="ERROR" timestamp="2023-01-15T14:30:00"/>
  <logEvent level="INFO"/>
</configuration>

高级用法:固定属性值

通过fixed属性可强制指定默认值:

<xs:element name="apiVersion">
  <xs:complexType>
    <xs:attribute name="value" type="xs:string" fixed="1.0"/>
  </xs:complexType>
</xs:element>

此时XML中若出现该元素,必须为:

<apiVersion value="1.0"/>

复合空元素的扩展应用

结合命名空间实现模块化设计:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://example.com/ns"
           xmlns:ns="http://example.com/ns">

  <xs:element name="security">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="ns:authToken"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="authToken">
    <xs:complexType>
      <xs:attribute name="expiry" type="xs:date" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

验证复合空元素的工具代码

使用Java DOM验证XML实例:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setSchema(SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
    .newSchema(new File("schema.xsd")));

Document doc = factory.newDocumentBuilder().parse(new File("instance.xml"));
// 若无异常则验证通过

常见错误处理

  1. 意外内容错误:当元素包含空格或换行时会被视为内容,解决方案是在Schema中明确禁止:

    <xs:complexType>
      <xs:simpleContent>
        <xs:restriction base="xs:string">
          <xs:length value="0"/>
        </xs:restriction>
      </xs:simpleContent>
      <xs:attribute name="type" type="xs:string"/>
    </xs:complexType>
    

  2. 缺少必需属性:通过use="required"标记的属性必须出现在实例文档中。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐