我刚刚开始使用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>
答案 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 ,,,