我试图引用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>
答案 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有效,请将code
和type
本地的定义移至他们使用的位置,而不是全球:
<?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>
所以你说没有办法引用一个属性 没有将其定义放在全球范围内?
不,我展示了如果您想通过更改XSD来消除错误,您可以声明code
和type
属性是本地的而不是全局的。
另外,为什么attributeGroup引用不会引发错误?
因为属性声明然后是属性组的本地。
使用属性的最常用方式 ,以及我建议您遵循的方式,除非您故意定义基于属性的词汇表为了与多个名称空间混合, 是让它们没有名称空间。
您拥有属性的选项不在命名空间中:
targetNamespace
。