对于具有相同名称的多个元素,XSD属性验证 - 不可能吗?

时间:2014-11-19 11:02:33

标签: xml xsd xml-validation



嘿伙计们,

情况如下:
我有一个包含许多(> 50)配置属性的XML文件。

这个XML内容看起来像这样:

<GlobalConfig>
    <ConfigurationSettings> 
        <Property Name="UseColors" Value="True" Visible="False"/>
        <Property Name="TitleMenu" Value="Configurator" Visible="True"/>
        <Property Name="InformationText" Value="For information please read readme.txt" Visible="True"/>
            [many more...]
    </ConfigurationSettings>
</GlobalConfig>


我现在想做的是创建一个xsd文件来验证这些东西。 对于每个属性,相应的value-attribute具有不同的contenttype(具有某些限制,如enums或regEx),因此值的内容的验证规则需要适用于每种情况。案例由“名称”-Attribute

决定

我是xsd-topic的新手,所以我尝试了一些事情:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="GlobalConfig">
        <xs:complexType>
            <xs:all>    

                <xs:element name="ConfigurationSettings">
                    <xs:complexType>
                        <xs:all>

                            <xs:element name="Property" minOccurs="0" maxOccurs="unbound">
                                <xs:complexType>                            
                                        <xs:attribute name="Name" fixed="UseColors" type="xs:string"/>
                                        <xs:attribute name="Value" default="True" type="xs:bool"/>
                                        <xs:attribute name="Visible" default="False" type="xs:bool"/>
                                </xs:complexType>
                            </xs:element>

                            <xs:element name="Property" minOccurs="0" maxOccurs="unbound">
                                <xs:complexType>                            
                                        <xs:attribute name="Name" fixed="TitleMenu" type="xs:string"/>
                                        <xs:attribute name="Value" default="Title" type="xs:string"/>
                                        <xs:attribute name="Visible" default="True" type="xs:bool"/>
                                </xs:complexType>
                            </xs:element>

                            <xs:element name="Property" minOccurs="0" maxOccurs="unbound">
                                <xs:complexType>                            
                                        <xs:attribute name="Name" fixed="InformationText" type="xs:string"/>
                                        <xs:attribute name="Value" default="See reedme.txt" type="xs:string"/>
                                        <xs:attribute name="Visible" default="True" type="xs:bool"/>
                                </xs:complexType>
                            </xs:element>

                        </xs:all>
                        <xs:attribute type="xs:string" name="Force"/>
                    </xs:complexType>
               </xs:element>

            </xs:all>
        </xs:complexType>
    </xs:element>

</xs:schema>

这不起作用,我想我明白为什么它不起作用: 问题是,我有许多具有相同名称的元素(“属性”)。

我有一种朦胧的感觉,它实际上不会以这种方式工作,并且需要更改configuration-xml的结构,以便每个属性都有不同名称的元素。

我认为这是以下帖子中的第二个答案。它似乎满足了提问者的需求,但他只有两个同名的元素,他也不想检查他们的属性: XML Schema for sequence of elements with same name but different attribute values?

您是否同意,它不适用于给定的configuration-xml结构?或者它仍然可能吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

XSD有一个名为&#34的约束;元素声明一致&#34;实际上,如果两个兄弟元素具有相同的名称,那么它们必须具有相同的类型。因此,彼此兄弟姐妹的不同Property元素不可能具有不同的验证规则。

在XSD 1.1中,有一种使用类型替代方案的解决方案。这允许您使元素的类型以其一个或多个属性的值为条件(在本例中为Name属性)。

是否有任何特殊原因导致您无法设计配置文件,而不是

<Property Name="UseColors" Value="True" Visible="False"/>

你使用

<UseColors Value="True" Visible="False"/>

使用前者(&#34;泛型&#34;)设计的主要原因是模式不必知道所有可能的属性名称。但实际上,您希望在架构中定义属性名称和有效值,因此第二种设计更合适。