无法引用xml架构

时间:2013-12-05 14:14:29

标签: xml xsd

我是xml的新手,在我的一个练习中,我试图将我的xml架构引用到我的xml文件中,但我不断从xml文件和架构中获取错误。这是我的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Individual SYSTEM "geneology.dtd">

<Individual xmlns="http://www.w3schools.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3schools.com Individual.xsd">

    <IndividualRec Id="G101">
        <FirstName>Adam</FirstName>
        <Surname>Jones</Surname>
        <Age>97</Age>
        <Gender>Male</Gender>
        <PersInfo>
            <Date>15 April 1916</Date>
            <Place>Birmingham</Place>
        </PersInfo>
    </IndividualRec>
<Individual>

这是我创建的xsd代码:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://www.w3schools.com/Individual"
  elementFormDefault="qualified">

  <xs:element name="Individual">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="IndividualRec"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="IndividualRec">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="FirstName"/>
        <xs:element ref="Surname"/>
        <xs:element ref="Age"/>
        <xs:element ref="Gender"/>
        <xs:element ref="PersInfo"/>
      </xs:sequence>
      <xs:attribute name="Id" use="required" type="xs:NCName"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="FirstName" type="xs:NCName"/>
  <xs:element name="Surname" type="xs:NCName"/>
  <xs:element name="Age" type="xs:integer"/>
  <xs:element name="Gender" type="xs:NCName"/>
  <xs:element name="PersInfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Date"/>
        <xs:element ref="Place"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Date" type="xs:string"/>
  <xs:element name="Place" type="xs:NCName"/>
</xs:schema>

请告诉我您可能认为错误的位置。

感谢

1 个答案:

答案 0 :(得分:0)

首先,命名空间之间存在不匹配。您的XML Individual位于http://www.w3schools.com,而您的XSD定位http://www.w3schools.com/Individual

所有三个引用必须同步:XSD的targetNamespace,您的XML名称空间和xsi:schemaLocation。

可能存在与您发布的DTD相关的其他问题;我没有看到任何与需要DTD内容的内容相关的内容,因此我建议确保它在没有它的情况下有效。

否则,欢迎来到SO;为避免懊恼,您可以随时返回并使用您可能认为相关的任何其他信息编辑您的帖子。

更新

当您使用targetNamespace时,也可以为其定义别名,或使其成为默认命名空间。这是为了避免出现“无法找到日期,地点等的定义”的错误;当你ref =“Date”时,例如,XSD规范期望有一个QName(限定名称)。如果没有默认命名空间,则表示{}日期,而您XSD定义{http://www.w3schools.com/Individual}日期。

这是一个有效的XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com/Individual" targetNamespace="http://www.w3schools.com/Individual"  elementFormDefault="qualified">
    <xs:element name="Individual">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="IndividualRec"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="IndividualRec">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="FirstName"/>
                <xs:element ref="Surname"/>
                <xs:element ref="Age"/>
                <xs:element ref="Gender"/>
                <xs:element ref="PersInfo"/>
            </xs:sequence>
            <xs:attribute name="Id" use="required" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="FirstName" type="xs:NCName"/>
    <xs:element name="Surname" type="xs:NCName"/>
    <xs:element name="Age" type="xs:integer"/>
    <xs:element name="Gender" type="xs:NCName"/>
    <xs:element name="PersInfo">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Date"/>
                <xs:element ref="Place"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Date" type="xs:string"/>
    <xs:element name="Place" type="xs:NCName"/>
</xs:schema>

这将是您有效的XML:

<?xml version="1.0" encoding="UTF-8"?>
<Individual xmlns="http://www.w3schools.com/Individual" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com/Individual Individual.xsd">
    <IndividualRec Id="G101">
        <FirstName>Adam</FirstName>
        <Surname>Jones</Surname>
        <Age>97</Age>
        <Gender>Male</Gender>
        <PersInfo>
            <Date>15 April 1916</Date>
            <Place>Birmingham</Place>
        </PersInfo>
    </IndividualRec>
</Individual>

我修复了名称空间;我假设Invididual.xsd与您的XSD文件位于同一文件夹中。

我还删除了DTD - 如果你真的需要它,你不必这样做。我会远离它......例如,在某些平台上默认禁止DTD处理,因此你必须进行额外的调整以使其工作。

以上内容应该让你开始。