如何比较两个XSComplexType是否相等?

时间:2016-07-01 11:56:06

标签: java xml xsd complextype xsom

我自动生成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>

显然&#34; someType&#34;和&#34; someOtherType&#34;是等价的。现在让我们说我想找出两个模式中哪些类型是等价的。我正在使用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();
        }
    }
}

是否有一种优雅的方式来检查两种&#34; complexType&#34;之间的这种平等。节点?

1 个答案:

答案 0 :(得分:1)

我不知道任何好的现成的比较工具。 (这并不意味着没有。)

为了解决你自己的问题,它不会(迈克尔凯)必须解决两个无上下文语法的等价问题:复杂类型的内容模型定义了常规语言,而不是无上下文语言。这种语言的原子符号是可能的子元素的XML元素类型名称(通配符在某种程度上使这种情况复杂化,但并非不成功),内容模型实质上定义了该语言的正则表达式。

您需要确定复杂类型的“相等”是否表示它们接受完全相同的输入集合作为有效,或者它们是否生成完全相同的类型注释输出树(PSVI)集合,或者两者都是。

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

要进一步检查输出上类型和其他注释的等效性,您需要确保对于语言中的每个符号,两个复杂类型将相同类型或等效类型分配给带有该符号的元素;您将通过所谓的元素声明一致性约束来帮助您完成此任务,该约束确保在任何合法的XSD架构中,不能为同名的两个兄弟元素分配不同的类型。 (不幸的是,尽管它的名称,它并不能确保没有两个同名的兄弟姐妹对元素声明的其他属性具有相同的值,例如可填充性或注释;对于这是一个错误还是一个特征,意见可能不同。)