无法解析架构文件-XML

时间:2018-07-11 08:40:06

标签: xml xsd

我是XML和XML模式的新手。我使用Notepad ++验证我的.xml,但无法正常工作,记事本向我返回此错误:“无法解析架构文件,在第32行解析错误:元素complexContent:内容无效预期为(Annotation?,(restriction | extension))“。
我的productivprocess.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="working">
    <xs:complexType name="working">
        <xs:sequence>
            <xs:element name="lot" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType name="lot">
                    <xs:all>
                        <xs:element name="atomicity" type="xs:boolean"/>
                    </xs:all>
                    <xs:attribute name="lotname" type="xs:string"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="resources" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:element name="resource" minOccurs="1" maxOccurs="unbounded">
                            <xs:complexType name="resource">
                                <xs:all>
                                    <xs:element name="available" type="xs:positiveInteger"/>
                                    <xs:element name="time" type="xs:positiveInteger"/>
                                </xs:all>
                                <xs:attribute name="resourcename" type="xs:string" use="required"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>   
            <xs:element name="process" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType name="process">
                    <xs:complexContent>
                        <xs:sequence>
                            <xs:element name="lot" type="lot" minOccurs="0" maxOccurs="unbounded"/>
                            <xs:element name="phase" minOccurs="1" maxOccurs="unbounded">
                                <xs:complexType name="phase" mixed="true">
                                    <xs:all>
                                        <xs:element name="power" type="xs:positiveInteger"/>
                                        <xs:element name="isDiff" type="xs:boolean"/>
                                        <xs:element name="timeDistribution" type="xs:boolean"/>
                                        <xs:element name="resource" type="resource"/>
                                    </xs:all>
                                <xs:attribute name="phasename" type="xs:string"/>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="specialphase" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:element name="phase" type="phase" minOccurs="1" maxOccurs="unbounded"/>
                                    <xs:attribute name="specialphasename" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="processname" type="xs:string"/>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
   </xs:schema>

这是我的.xml:

<?xml version="1.0" encoding="UTF-8"?>
<working xmlns="https://www.w3schools.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="productiveprocess.xsd">
    <lot name="lot1">
        <atomicity>0</atomicity><!-- 0 means indivisible -->
    </lot>
    <lot name="lot2">
        <atomicity>0</atomicity>
    </lot>
    <resources>
        <resource resourcename="A1">
            <resourcenumber>4</resourcenumber>
            <time>1h</time>
        </resource>
        <resource resourcename="A2">
            <resourcenumber>2</resourcenumber>
            <time>30min</time>
        </resource>
        <resource resourcename="A3">
            <resourcenumber>1</resourcenumber>
            <time>2h</time>
        </resource>
    </resources>
    <process name="process1">
        <lot ref="lot1"> <!-- THis could be equal to previuosly lot1 -->
            <atomicity>0</atomicity>
        </lot>
        <phase name="phase1">
            <power>5</power>
            <isDiff>0</isDiff> <!-- boolean, 0 not deferrable 1 deferrable-->
            <timeDistribution>0</timeDistribution> 
            <resource ref="A1"></resource> <!-- This could be equal to 
previuosly "A2" resource-->
        </phase>
        <phase name="phase2">
            <power>3</power>
            <isDiff>0</isDiff>
            <timeDistribution>1</timeDistribution>
            <resource ref="A2"></resource>
        </phase>
        <phase name="phase3">
            <power>6</power>
            <isDiff>0</isDiff>
            <timeDistribution>1</timeDistribution>
            <resource ref="A3"></resource>
        </phase>
        <specialphase name="specialphase4">
            <phase ref="phase2"></phase> <!-- This could be equal to previuosly phase2-->
            <phase ref="phase3"></phase>
        </specialphase>
    </process>
    <process name="process2">
        <lot ref="lot2">
            <atomicity>0</atomicity>
        </lot>
        <phase name="phase1">
            <power>5</power>
            <isDiff>0</isDiff>
            <timeDistribution>0</timeDistribution>
            <resource ref="A1"></resource>
        </phase>
        <phase name="phase2">
            <power>3</power>
            <isDiff>0</isDiff>
            <distrTempo>1</distrTempo>
            <resource ref="A2"></resource>
        </phase>
        <phase name="phase3">
            <power>6</power>
            <isDiff>0</isDiff>
            <timeDistribution>1</timeDistribution>
            <resource ref="A3"></resource>
        </phase>
        <specialphase name="specialphase4">
            <phase ref="phase2"></phase> 
            <phase ref="phase3"></phase>
        </specialphase>
    </process>
</working>

1 个答案:

答案 0 :(得分:0)

您的架构文件缺少结束</xs:schema>标记。

您不能在name元素中使用属性<xs:complexType>

根据需要,您不必要使用<xs:complexContent>或使用错误的元素。

<xs:attribute><xs:element>下无效,看起来不必要。

对于批次,阶段和资源,您具有三个自引用的type声明-它们看起来不必要。

以上所有内容仅与架构中的语法错误有关。但是,正如我在下面指出的那样,模式通常由一系列元素定义组成,然后将这些元素定义用于其他定义(请注意,这非常简单),而不是一次性定义整个文档。

例如,我使用XMLSpy为您的XML生成了一个示例架构。它给出的第一个定义是

<xs:element name="working">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="lot" maxOccurs="unbounded"/>
            <xs:element ref="resources"/>
            <xs:element ref="process" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

然后您将继续将元素“ lot”,“ resources”和“ process”定义为compexTypes等。

例如

<xs:element name="lot">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="atomicity"/>
        </xs:sequence>
        <xs:attribute name="ref">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="lot1"/>
                    <xs:enumeration value="lot2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="name">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="lot1"/>
                    <xs:enumeration value="lot2"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

(至少)有两种方法可以执行此操作。要么定义一个元素并引用它,例如

<xs:element name="resources">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="resource" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

然后

<xs:element ref="resources"/>

或定义类型并定义该类型的元素,例如

<xs:complexType name="resourcesType">
    <xs:sequence>
        <xs:element ref="resource" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

然后

<xs:element name="resources" type="resourcesType"/>

请注意,您可以命名一个独立的complexType,但不能在元素的定义中使用它。如果您想在文档中多次使用相同的类型,但是每个实例的名称不同,这将很有用。

这是整个生成的架构。我建议您将它与XML进行比较,以了解架构的结构。但是,不要只照原样生成这个模式。一旦您有了主意,就应该能够简化和/或重组它。

<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSpy v2007 sp2 (http://www.altova.com)-->
<xs:schema xmlns="https://www.w3schools.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.w3schools.com">
    <xs:element name="working">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="lot" maxOccurs="unbounded"/>
                <xs:element ref="resources"/>
                <xs:element ref="process" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="timeDistribution">
        <xs:simpleType>
            <xs:restriction base="xs:byte">
                <xs:enumeration value="0"/>
                <xs:enumeration value="1"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="time">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="1h"/>
                <xs:enumeration value="2h"/>
                <xs:enumeration value="30min"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="specialphase">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="phase" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="name" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="specialphase4"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="resources">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="resource" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="resourcenumber">
        <xs:simpleType>
            <xs:restriction base="xs:byte">
                <xs:enumeration value="1"/>
                <xs:enumeration value="2"/>
                <xs:enumeration value="4"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="resource">
        <xs:complexType>
            <xs:sequence minOccurs="0">
                <xs:element ref="resourcenumber"/>
                <xs:element ref="time"/>
            </xs:sequence>
            <xs:attribute name="resourcename">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="A1"/>
                        <xs:enumeration value="A2"/>
                        <xs:enumeration value="A3"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="ref">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="A1"/>
                        <xs:enumeration value="A2"/>
                        <xs:enumeration value="A3"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="process">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="lot"/>
                <xs:element ref="phase" maxOccurs="unbounded"/>
                <xs:element ref="specialphase"/>
            </xs:sequence>
            <xs:attribute name="name" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="process1"/>
                        <xs:enumeration value="process2"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="power">
        <xs:simpleType>
            <xs:restriction base="xs:byte">
                <xs:enumeration value="3"/>
                <xs:enumeration value="5"/>
                <xs:enumeration value="6"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="phase">
        <xs:complexType>
            <xs:sequence minOccurs="0">
                <xs:element ref="power"/>
                <xs:element ref="isDiff"/>
                <xs:choice>
                    <xs:element ref="distrTempo"/>
                    <xs:element ref="timeDistribution"/>
                </xs:choice>
                <xs:element ref="resource"/>
            </xs:sequence>
            <xs:attribute name="ref">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="phase2"/>
                        <xs:enumeration value="phase3"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="name">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="phase1"/>
                        <xs:enumeration value="phase2"/>
                        <xs:enumeration value="phase3"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="lot">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="atomicity"/>
            </xs:sequence>
            <xs:attribute name="ref">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="lot1"/>
                        <xs:enumeration value="lot2"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="name">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="lot1"/>
                        <xs:enumeration value="lot2"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="isDiff">
        <xs:simpleType>
            <xs:restriction base="xs:byte">
                <xs:enumeration value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="distrTempo">
        <xs:simpleType>
            <xs:restriction base="xs:byte">
                <xs:enumeration value="1"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="atomicity">
        <xs:simpleType>
            <xs:restriction base="xs:byte">
                <xs:enumeration value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>