XML模式多属性
我试图创建一个必需的元素,它有不同的子元素。示例XMl文件如下所示:XML模式多属性,xml,xsd,xml-validation,Xml,Xsd,Xml Validation,我试图创建一个必需的元素,它有不同的子元素。示例XMl文件如下所示: <datamodel> <info name="user"> <userRight>add user</userRight> </info> <info name="admin"> <role>manager</role> <
<datamodel>
<info name="user">
<userRight>add user</userRight>
</info>
<info name="admin">
<role>manager</role>
</info>
</datamodel>
<xs:element name="info" type="xs:anyType">
<xs:alternative test="@name='user'" type="userRightType"/>
<xs:alternative test="@name='admin'" type="roleType"/>
</xs:element>
添加用户
经理
我目前有以下xml模式
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="datamodel">
<xs:complexType>
<xs:sequence>
<xs:element name="info" maxOccurs="unbounded" minOccurs="0" >
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="userRight" minOccurs="0"/>
<xs:element type="xs:string" name="role" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:string" name="name" use="optional" fixed="user"/>
</xs:complexType>
</xs:element>
<xs:element name="info" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="userRight" minOccurs="0"/>
<xs:element type="xs:string" name="role" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:string" name="name" use="optional" fixed="admin"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
然而,给定的XML模式将无法使用我所拥有的示例XML文件。如何修改模式以验证这样的XML?使用XMLSchema1.1,通过该机制,您可以实现所需的功能。它看起来像这样:
<datamodel>
<info name="user">
<userRight>add user</userRight>
</info>
<info name="admin">
<role>manager</role>
</info>
</datamodel>
<xs:element name="info" type="xs:anyType">
<xs:alternative test="@name='user'" type="userRightType"/>
<xs:alternative test="@name='admin'" type="roleType"/>
</xs:element>
接下来,找到一个支持XMLSchema1.1的XML解析器。您没有提到您使用哪种语言,但我认为最新的Xerces2 Java支持它。您可以使用XMLSchema 1.1实现您想要的功能。它看起来像这样:
<datamodel>
<info name="user">
<userRight>add user</userRight>
</info>
<info name="admin">
<role>manager</role>
</info>
</datamodel>
<xs:element name="info" type="xs:anyType">
<xs:alternative test="@name='user'" type="userRightType"/>
<xs:alternative test="@name='admin'" type="roleType"/>
</xs:element>
接下来,找到一个支持XMLSchema1.1的XML解析器。您没有提到您使用哪种语言,但我认为最新的Xerces2 Java支持它。或者您可以使用RELAXNG而不是XML模式,Xerces、Saxon和大多数库也支持它,这使得指定此类内容非常容易,例如
或者,您可以使用RELAXNG而不是XML模式,Xerces、Saxon和大多数库也支持它,这使得指定这类内容非常容易,例如
因此,您正试图根据name
属性中的值更改info下所需的节点?这是系统特定的XMl文件,我无法更改XMl内容。但是,应该验证该内容,这是使用名称属性值区分该内容的唯一方法。因此,您正在尝试根据name
属性中的值更改信息下所需的节点?它是系统特定的XMl文件,我无法更改XMl内容。然而,该内容应该是有效的,并且是使用名称属性值来区分它的唯一方法。