需要一个没有属性XSD的元素

时间:2014-12-02 16:49:47

标签: xml xsd

我刚刚开始使用XSD尝试验证我一直在使用的XML配置文件。每个配置都指定服务器的默认配置,可以基于每个服务器覆盖。

这是默认值:

 <server>
  <cpu>65</cpu>
  // Other configuration
 </server>

这是(可选)覆盖:

 <server key="2">
  <cpu>55</cpu>
 </server>

我不确定如何构建XSD以支持没有属性的1个必需元素,以及具有属性的0-n元素,因为它们具有相同的名称。使用不同的名称,这是一个更容易的问题,但鉴于元素在其他方面是相同的,这似乎很混乱。

编辑:

要解决@ kjhughes的请求,请参阅简化的文档结构:

<configuration>
  <target>Production</target>
  <responsible>email@email.com</responsible>
  <server>
    <cpu>65</cpu>
  </server>
  <server key="2">
    <cpu>55</cpu>
  </server>
</configuration>

2 个答案:

答案 0 :(得分:1)

您不能在同一内容模型中使用同名的不同元素。

但是,您更改了第二个server元素的名称,以反映它们是服务器覆盖

<?xml version="1.0" encoding="UTF-8"?> 
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="try.xsd">
  <target>Production</target>
  <responsible>email@email.com</responsible>
  <server>
    <cpu>65</cpu>
  </server>
  <server-override key="2">
    <cpu>55</cpu>
  </server-override>
</configuration>

仍然通过扩展程序在类型定义中分享它们的共性:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="configuration">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="target"/>
        <xs:element name="responsible"/>
        <xs:element name="server" type="server-type"
                 minOccurs="1" />
        <xs:element name="server-override" type="server-override-type"
                 minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="server-type">
    <xs:sequence>
      <xs:element name="cpu"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="server-override-type">
    <xs:complexContent>
      <xs:extension base="server-type">
        <xs:attribute name="key" use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

答案 1 :(得分:-1)

尝试JAXB解组,创建可用于解组XML的java对象,这样可以更轻松地处理XML 使用xsd生成jaxb对象 根据您在eclipse中使用的IDE,您只需右键单击xmlroot并按generate jaxb ,,,