结合XML模式

时间:2012-11-01 09:27:13

标签: java xsd xsd-validation

是否存在允许在可能的情况下组合模式的Java库?

我正在创建一个应用程序,用户可以将多个“Generators”链接到用户定义的(可能是XML)数据集,每个“Generator”都有一个架构(可能是XSD),然后用户就可以输入数据了如果XSD可以轻松地组合成一个 - 那么对于该模式是有效的 - 这样整个数据集将与组合的XSD匹配,匹配每个Generator的模式。

我理解XSD可能存在冲突,但这不是问题,但如果这完全不可能,那么其​​他解决方案会是什么?

1 个答案:

答案 0 :(得分:1)

您确实可以将单独的XSD“导入”到其他模式。它非常简单,在“复合”模式中,您只需使用“import:schemaLocation”。请参阅我在项目中使用的代码中的以下示例:

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://test/interactions/AddToContext"
    xmlns:tns="http://test/interactions/AddToContext" xmlns:basictypes="http://test/interactions/BasicTypes" elementFormDefault="qualified">

    <import schemaLocation="BasicTypes.xsd"
        namespace="http://test/interactions/BasicTypes">
    </import>

    <!-- Request Message -->
    <element name="AddToContextRequest">
        <complexType>
            <sequence>
                <choice>
                    <element name="ServiceIdToAdd" type="string" maxOccurs="unbounded" />
                    <element name="ValueToAdd" type="basictypes:ContextValue" maxOccurs="unbounded" />
                </choice>
            </sequence>
        </complexType>
    </element>

    <!-- Response message -->
    <element name="AddToContextResponse">
        <complexType>
            <sequence>
                <element name="Result" type="string" />
            </sequence>
        </complexType>
    </element>
</schema>

您可以看到我已将“BasicTypes”架构导入此架构......

如果要将此模式用作生成Java代码(Classes)来操作这些对象的引用,可以使用“xjc”(XML绑定编译器)......这非常有用!< / p>

我希望这有帮助!干杯!


组合新XSD中的基本类型:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://test/interactions/AddToContext"
    xmlns:tns="http://test/interactions/AddToContext" elementFormDefault="qualified">

    <complexType name="ContextValue">
        <sequence>
            <element name="ValueID" type="string" />
            <choice>
                <sequence>
                    <element name="Value" type="string" />
                    <element name="ID" type="string" />
                </sequence>
                <element name="InfoValue" type="string" />
            </choice>
        </sequence> 
    </complexType>

    <!-- Request Message -->
    <element name="AddToContextRequest">
        <complexType>
            <sequence>
                <choice>
                    <element name="ServiceIdToAdd" type="string" maxOccurs="unbounded" />
                    <element name="ValueToAdd" type="tns:ContextValue" maxOccurs="unbounded" />
                </choice>
            </sequence>
        </complexType>
    </element>

    <!-- Response message -->
    <element name="AddToContextResponse">
        <complexType>
            <sequence>
                <element name="Result" type="string" />
            </sequence>
        </complexType>
    </element>
</schema>