Xml 找不到元素';作业';

Xml 找不到元素';作业';,xml,schema,Xml,Schema,所以我从XML和模式开始,今天我遇到了这个问题,但我还没有弄明白 我得到了一个错误,它说 第5列第2列:找不到 元素“赋值”的声明 我相信我已经声明了元素,但也许我遗漏了一些东西,并且没有 这是我的XML文件: <?xml version="1.0" encoding="UTF-8"?> <assignments xmlns="http://www.w3.org/2001/XMLSchema-instance" SchemaLocation="A3.xsd" &

所以我从XML和模式开始,今天我遇到了这个问题,但我还没有弄明白

我得到了一个错误,它说

第5列第2列:找不到 元素“赋值”的声明

我相信我已经声明了元素,但也许我遗漏了一些东西,并且没有

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<assignments
    xmlns="http://www.w3.org/2001/XMLSchema-instance"
    SchemaLocation="A3.xsd"
>
    <assignment id="a1">
        <name>Schemas</name>
        <page>110</page>
    </assignment>

    <assignment id="a2">
        <name>Namespaces</name>
        <page>258</page>
        <files>names.xml</files>
        <files>names.dtd</files>
    </assignment>

    <assignment id="a3">
        <name>RELAX NG</name>
        <page>305</page>
        <files>account.xml</files>
        <files>customers.xml</files>
        <files>finance.xsd</files>
    </assignment>

</assignments>

模式
110
名称空间
258
names.xml
names.dtd
放松
305
account.xml
customers.xml
finance.xsd
这是我的架构文件:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:target="http://www.levijackson.net/web340/ns" 
    targetNamespace="http://www.levijackson.net/web340/ns" elementFormDefault="qualified"
>
<element name="assignments" type="target:TypeAssignments"></element>

<complexType name="TypeAssignments">
    <sequence>
        <element name="assignment" type="target:assignmentInfo"></element>
    </sequence>
    <attribute name="id" type="string" use="required"/>
</complexType>

<complexType name="assignmentInfo">
    <sequence>
            <element name="name" type="string"></element>
            <element name="page" type="target:TypePage"></element>
            <element name="file" type="target:TypeFile" minOccurs="0" maxOccurs="unbounded"></element>
    </sequence>
</complexType>

<simpleType name="TypePage">
    <restriction base="integer">
        <minInclusive value="50" />
        <maxInclusive value="498" />
    </restriction>
</simpleType>

<simpleType name="TypeFile">
    <restriction base="string">
        <enumeration value=".xml" />
        <enumeration value=".dtd" />
        <enumeration value=".xsd" />
    </restriction>
</simpleType>

</schema>
<element name="assignment" type="target:assignmentInfo" minOccurs="0" maxOccurs="unbounded"></element>

由于我还在学习,请随意指出我可能犯的与问题无关的任何其他错误

谢谢

Levi

尝试以下方法。我去掉了schema元素的一些额外细节,但稍作调整,如下所示应该可以工作:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">        
  <xs:element name="assignments" type="TypeAssignments" />    
  <xs:complexType name="TypeAssignments">
    <xs:sequence>
      <xs:element name="assignment" type="assignmentInfo" 
          minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>        
  </xs:complexType>

  <xs:complexType name="assignmentInfo">
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
      <xs:element name="page" type="TypePage" />
      <xs:element name="files" type="xs:string"  minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="required" />
  </xs:complexType>   

  <xs:simpleType name="TypePage">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="50" />
      <xs:maxInclusive value="498" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TypeFile">
    <xs:restriction base="xs:string">
      <xs:enumeration value=".xml" />
      <xs:enumeration value=".dtd" />
      <xs:enumeration value=".xsd" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

注释

  • ID属性已从
    TypeAssignments
    移动到
    assignmentInfo
  • 所有类型和元素名称都以名称空间
    xs
  • 我已经为赋值元素添加了minOccurs和maxOccurs属性。否则,在赋值中只允许一个赋值元素
  • 我已经用“/>”而不是“”自动关闭了您的元素,这不是必需的,但要执行的键入操作要少一点

  • 总而言之,我并没有对所有内容进行太多修改,所以您的想法是正确的。

    在您的实例文档中,如上所述,您在
    上定义了
    xmlns
    属性

    但是,架构文档指定的
    targetNamespace
    值为“”。由于实例文档中的元素没有此命名空间,因此验证失败

    首先将实例文档更改为如下所示:

    <assignments
        xmlns="http://www.levijackson.net/web340/ns"
    

    这个问题的解决方案是,我没有将我的主元素“assignments”声明为复杂元素,实际上我根本没有将它声明为任何东西

    因此,通过从我的模式文件中获取这一行:

    <?xml version="1.0" encoding="UTF-8"?>
    <schema 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        xmlns:target="http://www.levijackson.net/web340/ns" 
        targetNamespace="http://www.levijackson.net/web340/ns" elementFormDefault="qualified"
    >
    <element name="assignments" type="target:TypeAssignments"></element>
    
    <complexType name="TypeAssignments">
        <sequence>
            <element name="assignment" type="target:assignmentInfo"></element>
        </sequence>
        <attribute name="id" type="string" use="required"/>
    </complexType>
    
    <complexType name="assignmentInfo">
        <sequence>
                <element name="name" type="string"></element>
                <element name="page" type="target:TypePage"></element>
                <element name="file" type="target:TypeFile" minOccurs="0" maxOccurs="unbounded"></element>
        </sequence>
    </complexType>
    
    <simpleType name="TypePage">
        <restriction base="integer">
            <minInclusive value="50" />
            <maxInclusive value="498" />
        </restriction>
    </simpleType>
    
    <simpleType name="TypeFile">
        <restriction base="string">
            <enumeration value=".xml" />
            <enumeration value=".dtd" />
            <enumeration value=".xsd" />
        </restriction>
    </simpleType>
    
    </schema>
    
    <element name="assignment" type="target:assignmentInfo" minOccurs="0" maxOccurs="unbounded"></element>
    
    
    
    并将其改为:

    <element name="assignments">
        <complexType>
            <sequence>
                <element name="assignment" type="target:assignmentInfo" minOccurs="0" maxOccurs="unbounded"></element>
            </sequence>
        </complexType>
    </element>
    
    
    
    元素定义正确,感谢大家的帮助


    Levi

    您不应该将其指定为默认名称空间,因为这样它会被视为XML中所有未明确指定名称空间的元素的名称空间。请将其指定给其他名称空间,如常用的xmlns:xsi。如果这样设置,是否需要指定如下元素类型:type=”xsi:string?是的。顺便说一句,在XSD模式中,通常使用xs,而在XML文件中使用xsi。我理解为什么使用xs:prefix作为名称空间。对我来说,将名称空间声明为在XML文件中使用是否更容易,这样我就不必在模式中的所有元素前面加上xs:?因此,如果我说“>不幸的是,您需要使用xs作为元素的前缀,因为类型(例如,字符串、元素、枚举等)被定义为单独模式的一部分。如果在模式的顶部我声明而不是仅仅说,那么这将成为页面的默认模式吗?对于我的其他元素,我会在开始标记中指定另一个模式,如so:xmlns:target=“”targetNamespace=“”elementFormDefault=“qualified”,然后对我创建的属性值使用target:assignmentInfo等。我尝试了这一点,通过将顶级xmlns:xs=“…”属性设置为xmlns=“…”它似乎可以工作,但在引用目标名称空间时,它会变得混乱。我不确定您告诉我应该做什么,您粘贴的内容就是我上面的内容。此外,targetNamespace引用的是我在其正上方声明的第二个命名空间。除非我误解了targetNamespace的工作原理。