1

異なるサブ要素を持つ必須要素を作成しようとしています。次のようなXMlファイルの例:

<datamodel>
    <info name="user">
        <userRight>add user</userRight>
    </info>
    <info name="admin">
        <role>manager</role>
    </info>
</datamodel>

私は現在、次の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を検証するためにスキーマを変更するにはどうすればよいですか?

4

2 に答える 2

4

XML Schema 1.1 では、 Type Alternativeメカニズムを使用して、目的を達成できます。次のようになります。

<xs:element name="info" type="xs:anyType">
    <xs:alternative test="@name='user'" type="userRightType"/>
    <xs:alternative test="@name='admin'" type="roleType"/>
</xs:element>

次に、XML スキーマ 1.1 をサポートする XML パーサーを探します。使用する言語については言及されていませんが、最新の Xerces2 Java がサポートしていると思います。

于 2012-12-11T10:04:45.407 に答える
1

別の方法として、XML スキーマの代わりに Relax NG を使用することもできます。これは、Xerces、Saxon、およびほとんどのライブラリでもサポートされており、この種のものを非常に簡単に指定できます。

<?xml version="1.0" encoding="UTF-8"?>
<grammar 
  xmlns="http://relaxng.org/ns/structure/1.0"
  xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">

  <start>
    <element name="datamodel">
      <oneOrMore>
        <ref name="info" />
      </oneOrMore>
    </element>
  </start>

  <define name="info">
    <element name="info">
      <choice>
        <group>
         <attribute name="name">
           <value>user</value>
         </attribute>
         <oneOrMore>
           <ref name="user-right" />
         </oneOrMore>
        </group>
        <group>
          <attribute name="name">
            <value>admin</value>
          </attribute>
          <oneOrMore>
            <ref name="role" />
          </oneOrMore>
        </group>
      </choice>
    </element>
  </define>

  <define name="role">
    <element name="role">
      <choice>
        <value>admin</value>
        <value>manager</value>
        <value>user</value>
      </choice>
    </element>
  </define>

  <define name="user-right">
    <element name="userRight">
      <choice>
        <value>add user</value>
        <value>delete user</value>
        <value>edit user</value>
      </choice>
    </element>
  </define>
</grammar>

それぞれが特定の値をgroup持つname属性と特定の型の 1 つ以上の要素を指定し、それらの型自体は特定の値に制限されます。

個人的には、Relax NG は XML スキーマよりもはるかに自然で、XSD を使用できないルールを指定できます。チュートリアルは、参照として必要なすべてのものであり、実際には非常に簡単です:)

http://relaxng.org/tutorial-20011203.html

于 2013-10-10T02:42:17.537 に答える