3

次の XML があります。

<?xml version="1.0" encoding="utf-8"?>
<MainElement>
    <id>1</id>
    <name>John</name>
    <custom>
        <age>43</age>
        <sex>male</sex>
    </custom>
</MainElement>

そして別の XML ファイル:

<?xml version="1.0" encoding="utf-8"?>
<MainElement>
    <id>2</id>
    <name>Dave</name>
    <custom>
        <age>51</age>
        <county>England</country>
        <city>London</city>
    </custom>
</MainElement>

両方の XML ファイルの主な構造は同じですが、<custom>要素の実装が異なります。<custom>要素のタイプが xs:anyType である「id」や「name」などの要素をチェックするための XSD ファイルが既にあります。<custom>存在する他のすべての要素を調べずに、要素のみを検証する別の XSD ファイルを作成することは可能ですか?

4

2 に答える 2

0

2人の顧客について説明します。custom最初のXSDは、参照しているが定義していないものを除いて、すべての一般的な部分をキャプチャすることになっている基本的なXSDです。「ぶら下がっている」ままにしておきます。

以下はcommon.xsdです:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="MainElement">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="id" type="xsd:unsignedByte" />
        <xsd:element name="name" type="xsd:string" />
        <xsd:element ref="custom"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

次に、ごとに1つのXSDの定義を開始しますcustom。最初のXML(custom-1.xsd)の場合:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="custom">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="age" type="xsd:unsignedShort"/>
                <xsd:element name="sex" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

そして2つ目は、custom-2.xsdです。

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="custom">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="age" type="xsd:unsignedShort"/>
                <xsd:element name="country" type="xsd:string"/>
                <xsd:element name="city" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

次に、XSDを適切にロードして、顧客ごとに1つのスキーマセットを作成する必要があります。最初のセットには、common + custom-1、次にcommon+custom-2などが含まれます。

これは、QTAssistantを使用してこれらのセットを「視覚化」する方法です。

ここに画像の説明を入力してください

もちろん、それ自体Commonは無効です。

Error occurred while loading [file:///.../validate-xml-element-with-xsd-2.xsd], line 9 position 10.
The 'custom' element is not declared.

ただし、セット内の追加のXSDにより、欠落している定義がスコープに含まれるため、他の各コレクションは有効です。これで、各ベンダーのXMLを関連するセットで検証できます。共通のXSDを共有しているため、ベンダー間で共通の定義の整合性を維持し、ダングリング定義を使用してXSD1.0の「制限」を回避します。私は実際には制限ではないと思います。それはおそらく「それほどエレガントではない」アプローチです...

処理の観点からは、一般的なXSDを、ベンダーの数だけコンパイルしてロードするというオーバーヘッドが発生します。

これが負担になる場合は、XMLの前処理のリターンが報われたら、別の戦略を使用することもできます。anyTypeとして定義したままcustomにすることも、xsd:anyに置き換えることもできます。コモンを検証したら、ノード(XSLTまたはDOM API、あるいはDOMノードリーダーの上にある検証リーダーなど)を抽出し、適切なXSDを使用して個別に検証します。

後者のアプローチの利点は、XSDに関してオーバーヘッドが発生しないことです。もちろん、トレードオフにより、処理のフットプリントが増加する可能性があります。

XSD 1.1、XSD 1.0 + Schematron、RelaxNGは、独自の長所と短所を持つ別のスキーマ言語を含むソリューションです。上記は、少なくともあなたが持っているオプションのいくつかを理解するのに役立つはずだと思います...

于 2012-11-02T01:09:32.077 に答える
0

XSD では、ANY の文字通りの意味を使用することはできません。

したがって、XML の一部として提供されるものはすべて、何らかの方法で宣言する必要があります。

import/include を使用する方法に賛成です..これはクリーンであり、要件をさらに拡張できます..しかし、それでも ANY 要素の可能な名前を知っておく必要があります..

必須ではありませんが、XSD を 1 つだけSequence使用して、別の使用方法を知りchoice、要件を達成することをお勧めします。

XML1 と XML2 の両方を検証するコードは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MainElement">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="id" type="xs:unsignedByte" />
        <xs:element name="name" type="xs:string" />
        <xs:element name="custom">
          <xs:complexType>
            <xs:sequence>
              <xs:choice>
                <xs:element name="age" type="xs:unsignedByte" />
              </xs:choice>
              <xs:choice>
                <xs:sequence>
                  <xs:element name="sex" type="xs:string" />
                </xs:sequence>
                <xs:sequence>
                  <xs:element name="country" type="xs:string"/>
                  <xs:element name="city" type="xs:string"/>
                </xs:sequence>
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

これは今のところ役に立たないかもしれませんが、将来役立つかもしれません..

于 2012-11-26T08:43:19.347 に答える