嘿伙计们,
情况如下:
我有一个包含许多(> 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结构?或者它仍然可能吗?
非常感谢!
答案 0 :(得分:2)
XSD有一个名为&#34的约束;元素声明一致&#34;实际上,如果两个兄弟元素具有相同的名称,那么它们必须具有相同的类型。因此,彼此兄弟姐妹的不同Property元素不可能具有不同的验证规则。
在XSD 1.1中,有一种使用类型替代方案的解决方案。这允许您使元素的类型以其一个或多个属性的值为条件(在本例中为Name属性)。
是否有任何特殊原因导致您无法设计配置文件,而不是
<Property Name="UseColors" Value="True" Visible="False"/>
你使用
<UseColors Value="True" Visible="False"/>
使用前者(&#34;泛型&#34;)设计的主要原因是模式不必知道所有可能的属性名称。但实际上,您希望在架构中定义属性名称和有效值,因此第二种设计更合适。