我正在自动生成 XML-Schemata,并且生成的 xsd 文件是根据百叶窗设计模式创建的。现在我有很多复杂的类型,想减少它们的数量。是否有一种简单的方法可以确定两种复杂类型是否描述了相同的限制?
这是一个向您展示我的意思的示例:
<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”是等价的。现在假设我想找出两个模式中的哪些类型是等价的。我正在使用 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();
}
}
}
有没有一种优雅的方法来检查两个“complexType”节点之间的这种相等性?