使用多个XSD

时间:2009-10-23 14:56:20

标签: xml xsd

我有一个xsd,它有3个导入到另一个xsd,8个复杂类型和3个简单类型。

现在我必须只处理1个compex类型,它继承了许多其他XSD - 主要是当前xsd所拥有的3个进口。

我将仅获得仅包含1种复杂类型的XML文件,我已经提到过。

现在我正在尝试生成包含根据单一复杂类型的数据的示例XML文件,并尝试验证它,但是当我尝试使用XMLSpy或OxygenXML时,它表示没有定义根节点。

现在,当我尝试定义根节点时,它不允许我这样做,如果我尝试为这个复杂类型创建另一个xsd,它也会给我一些错误,因为这个复杂类型指向的是继承的xsd初始xsd不能用于新的xsd,我试图继承3 xsd的复杂类型指向新xsd中的初始xsd,但它仍然不起作用。

另外我的另一个问题是 - 与完整的XSD相比,我们是否可以针对XSD的某些部分验证XML文件,因为根据XSD中的1个复杂元素类型,XML得到的是什么?

初始XSD的格式:

 <?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:schema location targetNamespace=targetnamespace elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.652">
    <xs:import namespace=first xsd which is imported>
    <xs:import namespace=second xsd which is imported>
    <xs:import namespace=third xsd which is imported>
    <xs:complexType name="firstcomplextype" abstract="false">
        <xs:sequence>
            <xs:element name="some value" type="xs:string" minOccurs="0"/>
            <xs:element name="some value" type="some value"/>
            <xs:element name="some value" type="xs:string" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="some value" type="xs:int" use="required"/>
        <xs:attribute name="some value" type="xs:value" use="required"/>
        <xs:attribute name="some value" type="xs:int" use="required"/>
    </xs:complexType>
    <xs:complexType name="second complex type" abstract="false">
        <xs:sequence>
            <xs:element name="some value" type="xs:some value" minOccurs="0"/>
            <xs:element name="some value" type="xs:some value" minOccurs="0"/>
            <xs:element name="some value" type="some value"/>
            <xs:element name="some value" type="some value"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="third complex type**I need to work with only this complex type and xml file will contain data according to this complex type only and I need to validate incoming XML against only this complex type**" abstract="false">
        <xs:sequence>
            <xs:element name="some value" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="some value" type="some value"/>
            <xs:element name="some value" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>---**Here this particular element points to another XSD, one of the imported XSD's**
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:sequence minOccurs="0">
                <xs:element name="some value" type="xs:some value" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="some value" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>---**Here this particular element points to another XSD, one of the imported XSD's**
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:sequence minOccurs="0">
                <xs:element name="some value" type="xs:some value" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="some value" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="some value" type="some value" minOccurs="0" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="4th complex type" abstract="false">
        <xs:sequence>
            <xs:element name="elements">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="some value" type="some value" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

并且xsd继续,因为它有许多更复杂的类型和简单类型。任何指导都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

您发布的架构文件仅显示complexType个定义。要验证XML文档,您应该在顶层具有与文档根元素匹配的element声明。如果您的架构(或其中一个导入的架构)具有此类架构,请发布该部分以及您尝试验证的简短XML文档。

验证模式的“部分”没有问题。顶级的任何element声明都可以作为经过验证的XML文档的根元素,因为XML Schema没有定义根元素的概念(与DTD和RELAX NG不同,后者更加面向文档)。 / p>

如果您可以控制XML文档,还可以尝试将xsi:type属性附加到根元素,以指示您要验证的complexType。所以你会添加像

这样的东西
xsi:type="firstcomplextype" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

在XML文档的根元素的属性中。

答案 1 :(得分:0)

您需要在架构中添加一个元素,该元素具有您要使用的复杂类型。元素声明如下所示:

代码:全选

   <xs:element name="newElement" type="thirdComplexType"/>

您可以直接在当前架构中声明您的元素(您举例说明的那个),或者您可以创建一个新架构,导入当前架构并在那里声明元素。

生成的XML文件将针对复杂类型“thirdComplexType”进行验证,因为它将以“newElement”作为根元素。换句话说,XML文件会自动针对XSD的某些部分进行验证。

您可以在此处阅读有关XML Schema的更多信息: