1

私は自動的に XML スキーマを生成しており、結果の xsd ファイルはベネチアン ブラインド デザイン パターンに従って作成されています。現在、複雑な型がたくさんあり、その数を減らしたいと考えています。2 つの複合型が同じ制限を記述しているかどうかを判断する簡単な方法はありますか?

これが私が何を意味するかを示す例です:

    <xs:complexType name="someType">
      <xs:choice>
          <xs:element name="BR" type="xs:string"/>
          <xs:element name="A" type="xs:string"/>
      </xs:choice>
    </xs:complexType>

    <xs:complexType name="someOtherType">
      <xs:choice>
          <xs:element name="A" type="xs:string"/>
          <xs:element name="BR" type="xs:string"/>
      </xs:choice>
    </xs:complexType>

明らかに、「someType」と「someOtherType」は同等です。ここで、2 つのスキーマのどのタイプが同等かを調べたいとしましょう。XSOM を使用してスキーマを解析しています。

    import java.io.File;
import java.io.IOException;
import java.util.Map;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import com.sun.xml.xsom.XSComplexType;
import com.sun.xml.xsom.XSSchema;
import com.sun.xml.xsom.XSSchemaSet;
import com.sun.xml.xsom.parser.XSOMParser;

public class MyXSOM {

    public static void main(String[] args) {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        XSOMParser parser = new XSOMParser(factory);

        try {
            parser.parse(new File("schema.xsd"));
            parser.parse(new File("schema2.xsd"));

            XSSchemaSet sset = parser.getResult();
            XSSchema schema1 = sset.getSchema(0);
            XSSchema schema2 = sset.getSchema(1);

            Map<String, XSComplexType> schema1ComplexTypes = schema1.getComplexTypes();
            Map<String, XSComplexType> schema2ComplexTypes = schema2.getComplexTypes();

            for(XSComplexType currentType1: schema1ComplexTypes.values()){
                for(XSComplexType currentType2: schema2ComplexTypes.values()){
                    // if currentType1 and currentType2 define the same complexType, do s.t. 
                }
            }

        } catch (SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

2 つの「complexType」ノード間のこの種の等価性をチェックする洗練された方法はありますか?

4

1 に答える 1

1

すぐに使える優れた型比較ツールを知りません。(全くないというわけではありません。)

独自のものを作成するために、2 つの文脈自由文法の同等性の問題を解決する必要はありません (ペース マイケル ケイ): 複合型のコンテンツ モデルは、文脈自由言語ではなく通常の言語を定義します。この言語のアトミック シンボルは、可能性のある子の XML 要素型名であり (ワイルドカードはこれをいくらか複雑にしますが、解決できないわけではありません)、コンテンツ モデルは基本的にその言語の正規表現を定義します。

複合型の「同等性」とは、正確に同じ入力セットを有効なものとして受け入れることを意味するのか、まったく同じセットの型注釈付き出力ツリー (PSVI) を生成することを意味するのか、またはその両方を意味するのかを判断する必要があります。

1 つ目はかなり簡単です。どのオートマトン理論の教科書でも、正規表現から有限状態オートマトンを構築する方法と、認識される言語の等価性について 2 つの FSA を比較する方法が説明されています。(しかし、あなたがエレガントな方法を求めているので、少なくとも一部の読者にとってはよりエレガントに見える、そのようなタスクの代替方法を提供している、Brzozowski 導関数について話しているオートマトン理論の教科書はほとんどないことがわかります。)

出力の型とその他の注釈の等価性をさらに確認するには、言語の各シンボルについて、2 つの複合型が同じ型または同等の型をそのシンボルを持つ要素に割り当てていることを確認する必要があります。このタスクは、いわゆる Element Declarations Consistent 制約によって支援されます。これにより、正当な XSD スキーマでは、同じ名前を持つ 2 つの兄弟要素に異なる型が割り当てられないことが保証されます。(残念ながら、その名前にもかかわらず、同じ名前の 2 つの兄弟が要素宣言の他のプロパティ (nillability や注釈など) に対して同じ値を持たないことを保証するものではありません。これがバグなのか機能なのかについて意見が異なる場合があります。 .)

于 2016-07-03T15:40:26.037 に答える