gpt4 book ai didi

java - 如何比较两个 XSD ComplexType 是否相等?

转载 作者:行者123 更新时间:2023-11-30 07:17:19 27 4
gpt4 key购买 nike

我自动生成 XML 架构,生成的 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”节点之间的这种相等性?

最佳答案

我不知道有什么好的现成类型比较工具。 (这并不意味着没有。)

要推出自己的语言,(迈克尔·凯)没有必要解决两个上下文无关语法的等价问题:复杂类型的内容模型定义常规语言,而不是上下文无关语言。这种语言的原子符号是可能的子代的 XML 元素类型名称(通配符使这个问题有些复杂,但并非无法解决),并且内容模型本质上定义了该语言的正则表达式。

您需要确定复杂类型的“相等”是否意味着它们接受完全相同的一组有效输入,或者它们生成完全相同的一组带类型注释的输出树(PSVI),或者两者兼而有之。

第一个相当简单:任何自动机理论教科书都会解释如何从正则表达式构造有限状态自动机,以及如何比较两个 FSA 是否与它们所识别的语言等效。 (但是既然你要求一种优雅的方式,我会观察到我见过的自动机理论教科书很少谈论布佐佐夫斯基导数,它们为此类任务提供了替代方法,至少看起来更优雅一些读者。)

要进一步检查输出上的类型和其他注释的等效性,您需要确保对于语言中的每个符号,两个复杂类型将相同的类型或等效类型分配给带有该符号的元素;所谓的元素声明一致性约束将帮助您完成此任务,该约束确保在任何合法的 XSD 模式中,不会为两个同名的同级元素分配不同的类型。 (不幸的是,尽管它的名字如此,但它并不能确保同名的两个同级元素声明的其他属性(例如可空性或注释)不会具有相同的值;对于这是错误还是功能,意见可能会有所不同.)

关于java - 如何比较两个 XSD ComplexType 是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38144822/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com