Java 组合XML模式

Java 组合XML模式,java,xsd,xsd-validation,Java,Xsd,Xsd Validation,如果可能的话,是否有允许组合模式的Java库 我正在创建一个应用程序,其中用户可以将多个“生成器”链接到用户定义的(可能是XML)数据集,每个“生成器”都有一个模式(可能是XSD),然后用户可以输入对该模式有效的数据,如果XSD可以很容易地组合成一个XSD,那就太好了,这样整个数据集就可以匹配组合的XSD,匹配每个生成器的模式 我知道XSD可能会发生冲突,但这不是问题,但如果这完全不可能,还有什么其他解决方案呢?您确实可以将单独的XSD“导入”到其他模式。这非常简单,在“复合”模式中,您只需要使

如果可能的话,是否有允许组合模式的Java库

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


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

您确实可以将单独的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代码(类)来操作这些对象,可以使用“”(XML绑定编译器)。。。它非常有用

我希望这有帮助!干杯


在新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>

您确实可以将单独的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代码(类)来操作这些对象,可以使用“”(XML绑定编译器)。。。它非常有用

我希望这有帮助!干杯


在新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>


我不完全理解您想做什么,但是您可以使用
导入
包含
:结合模式,特别强调变色龙模式。即使在一些主要的XSD项目中,这些都会被忽略,造成灾难性的后果。我不完全理解您试图做什么,但是您可以使用
import
include
:特别强调变色龙模式来组合模式。即使在一些主要的XSD项目中,它们也往往被忽略,这会带来灾难性的后果。通过组合XSD的结构,在没有名称空间的情况下,这会起作用吗?请参阅问题中的注释。如果我理解正确,您可以这样做。。。请参阅编辑后的答案(使用组合XSD而不是导入),您只需将“basicTypes:ContextValue”ComplexType复制到新的XSD,其中包含您想要组合在一起的所有基本类型……通过组合XSD的结构,在没有名称空间的情况下,这会起作用吗?请参阅问题中的注释。如果我理解正确,您可以这样做。。。请参阅已编辑的答案(使用组合XSD而不是导入),您只需将“basicTypes:ContextValue”ComplexType复制到包含所有要组合在一起的基本类型的新XSD。。。