1

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

我正在创建一个应用程序,用户可以将多个“生成器”链接到用户定义的(可能是 XML)数据集,每个“生成器”都有一个模式(可能是 XSD),然后用户可以输入有效的数据模式,如果 XSD 可以很容易地组合成一个,那就太好了 - 这样整个数据集就会匹配组合的 XSD,匹配每个生成器的模式。

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

4

1 回答 1

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代码(类)来操作这些对象,你可以使用“ xjc ”(XML Binding Compiler)...非常有用!

我希望这有帮助!干杯!


在新的 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>
于 2012-11-01T09:49:08.123 回答