2014-12-02 86 views
1

我刚开始尝试验证我一直在使用的XML配置文件。每个配置都指定一个服务器的默认配置,可以基于每个服务器进行覆盖。需要一个没有属性的元素XSD

这是默认:

<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 protected]</responsible> 
    <server> 
    <cpu>65</cpu> 
    </server> 
    <server key="2"> 
    <cpu>55</cpu> 
    </server> 
</configuration> 

回答

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 protected]</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> 
+0

我很害怕这将是浏览规范的情况。尽管如此,使用扩展可以使这个过程变得更加简单。谢谢! – mgw854 2014-12-02 18:23:15

-1

尝试JAXB解组,您可以创建可用于解组XML的Java对象,这使得它更容易处理XML 使用XSD为generationg的JAXB对象 取决于你在Eclipse中你只需要右键点击你的xmlroot并按生成JAXB什么IDE ,,,

+0

问题是我没有XSD(我也没有使用Java)。 – mgw854 2014-12-02 17:01:03

相关问题