1

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

4

1 回答 1

1

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

自己动手,没有必要(以 Michael Kay 的速度)解决两个上下文无关文法的等价问题:复杂类型的内容模型定义了常规语言,而不是上下文无关语言。这种语言的原子符号是可能的子元素的 XML 元素类型名称(通配符使这有点复杂,但并非无法解决),内容模型本质上定义了该语言的正则表达式。

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

第一个相当简单:任何自动机理论教科书都将解释如何从正则表达式构造有限状态自动机,以及如何比较两个 FSA 以了解它们识别的语言的等价性。(但是由于您要求一种优雅的方式,我会发现很少有我见过的自动机理论教科书谈论 Brzozowski 导数,它为这些任务提供了替代方法,至少对某些读者来说似乎更优雅。)

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

于 2016-07-03T15:40:26.037 回答