java如何比较两个XSComplexType是否相等?
我将自动生成XML模式,并根据venetian blind设计模式创建生成的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”节点之间的这种相等性
# 1 楼答案
我不知道有什么现成的比较工具。(这并不意味着没有。)
为了实现自己的功能,不必(佩斯·迈克尔·凯)解决两个上下文无关语法的等价性问题:复杂类型的内容模型定义的是常规语言,而不是上下文无关语言。这种语言的原子符号是可能的子元素的XML元素类型名称(通配符使这一点有点复杂,但不是绝对复杂),内容模型本质上定义了该语言上的正则表达式
您需要确定复杂类型的“相等”是指它们接受完全相同的输入集作为有效输入,还是它们生成完全相同的类型注释输出树集(PSVI),或者两者兼而有之
第一个相当简单:任何自动机理论教科书都会解释如何从正则表达式构造有限状态自动机,以及如何比较两个FSA,以确定它们所识别的语言的等价性。(但既然你要求的是一种优雅的方式,我会注意到,我所看到的自动机理论教科书中很少有谈到Brzowski导数,它为这类任务提供了替代方法,至少在一些读者看来更优雅。)
要进一步检查输出上类型和其他注释的等效性,您需要确保对于语言中的每个符号,两个复杂类型为承载该符号的元素指定相同的类型或等效类型;在这个任务中,所谓的元素声明一致性约束将帮助您完成,它确保在任何合法的XSD模式中,没有两个同名的同级元素可以被分配不同的类型。(不幸的是,尽管名称不同,但它不能确保具有相同名称的两个兄弟元素在元素声明的其他属性(如nillability或annotation)中没有相同的值;对于这是bug还是特性,可能会有不同的意见。)