私は自動的に 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」ノード間のこの種の等価性をチェックする洗練された方法はありますか?