使用全局属性和命名空间验证XSD

时间:2015-03-17 19:48:01

标签: xml xsd xml-validation

我试图引用XSD文件(XML Schema)中的一些属性,并收到以下错误:

  

属性'代码'不允许出现在元素' project'。

中      

属性'类型'不允许出现在元素'期间'。

     

属性'类型'不允许出现在元素'期间'。

任何人都可以向我解释我做错了什么吗?

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<timesheets xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets timesheets.xsd">
        <employee id="234456" ismanager="false" hiredate="2003-01-12">
            <firstname>Julie</firstname>
            <surname>Smith</surname>
        </employee>
        <projects>
            <project code="TSK2367">
                <task>
                    <description>Create project plan for MIJ website</description>
                    <duration type="days">
                        <planned>2</planned>
                        <actual>1</actual>
                    </duration>
                </task>
                <task>
                    <description>Draft the conceptual web site navigation for MIJ</description>
                    <duration type="hours">
                        <planned>3</planned>
                        <actual>2</actual>
                    </duration>
                </task>
            </project>
        </projects>
    </timesheets>

这是我的XSD文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified"
        targetNamespace="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
        xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
        >

        <xs:attributeGroup name="employeeAttrs">
            <xs:attribute name="id" type="xs:int" />
            <xs:attribute name="ismanager" type="xs:boolean" />
            <xs:attribute name="hiredate" type="xs:date" />
        </xs:attributeGroup>
        <xs:element name="firstname" type="xs:string" />
        <xs:element name="surname" type="xs:string" />
        <xs:attribute name="code" type="xs:string" />
        <xs:element name="description" type="xs:string" />
        <xs:attribute name="type" type="xs:string" />
        <xs:element name="planned" type="xs:int" />
        <xs:element name="actual" type="xs:int" />



        <xs:element name="timesheets">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="employee">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element ref="firstname" />
                                <xs:element ref="surname" />
                            </xs:sequence>
                            <xs:attributeGroup ref="employeeAttrs" />
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="projects">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="project" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="task" maxOccurs="unbounded">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:element ref="description" />
                                                        <xs:element name="duration">
                                                            <xs:complexType>
                                                                <xs:sequence>
                                                                    <xs:element ref="planned" />
                                                                    <xs:element ref="actual" />
                                                                </xs:sequence>
                                                                <xs:attribute ref="type" />
                                                            </xs:complexType>
                                                        </xs:element>
                                                    </xs:sequence>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:sequence>
                                        <xs:attribute ref="code" />
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

1 个答案:

答案 0 :(得分:2)

如果您希望更改XML以符合XSD ,请为xmlns:ts="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"定义名称空间前缀,并将其用于未找到的属性:

<?xml version="1.0" encoding="UTF-8"?>
<timesheets xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
            xmlns:ts="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets
                                timesheets.xsd">
  <employee id="234456" ismanager="false" hiredate="2003-01-12">
    <firstname>Julie</firstname>
    <surname>Smith</surname>
  </employee>
  <projects>
    <project ts:code="TSK2367">
      <task>
        <description>Create project plan for MIJ website</description>
        <duration ts:type="days">
          <planned>2</planned>
          <actual>1</actual>
        </duration>
      </task>
      <task>
        <description>Draft the conceptual web site navigation for MIJ</description>
        <duration ts:type="hours">
          <planned>3</planned>
          <actual>2</actual>
        </duration>
      </task>
    </project>
  </projects>
</timesheets>

如果您希望更改XSD以使XML有效,请将codetype本地的定义移至他们使用的位置,而不是全球:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           targetNamespace="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
           xmlns:ts="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
           xmlns="http://www.dcs.bbk.ac.uk/~lharar01/ns/timesheets"
           >

  <xs:attributeGroup name="employeeAttrs">
    <xs:attribute name="id" type="xs:int" />
    <xs:attribute name="ismanager" type="xs:boolean" />
    <xs:attribute name="hiredate" type="xs:date" />
  </xs:attributeGroup>

  <xs:element name="firstname" type="xs:string" />
  <xs:element name="surname" type="xs:string" />
  <xs:element name="description" type="xs:string" />
  <xs:element name="planned" type="xs:int" />
  <xs:element name="actual" type="xs:int" />

  <xs:element name="timesheets">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="employee">
          <xs:complexType>
            <xs:sequence>
              <xs:element ref="firstname" />
              <xs:element ref="surname" />
            </xs:sequence>
            <xs:attributeGroup ref="employeeAttrs" />
          </xs:complexType>
        </xs:element>
        <xs:element name="projects">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="project" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="task" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element ref="description" />
                          <xs:element name="duration">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element ref="planned" />
                                <xs:element ref="actual" />
                              </xs:sequence>
                              <xs:attribute name="type" type="xs:string" />
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="code" type="xs:string" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

在评论中更新每个OP问题:

  

所以你说没有办法引用一个属性   没有将其定义放在全球范围内?

不,我展示了如果您想通过更改XSD来消除错误,您可以声明codetype属性是本地的而不是全局的。

  

另外,为什么attributeGroup引用不会引发错误?

因为属性声明然后是属性组的本地。

关于属性和命名空间的建议

使用属性的最常用方式 ,以及我建议您遵循的方式,除非您故意定义基于属性的词汇表为了与多个名称空间混合, 是让它们没有名称空间。

您拥有属性的选项不在命名空间中:

  1. 没有targetNamespace
  2. 将属性本地声明为元素或属性组。