元素已定义错误

时间:2013-02-24 17:03:13

标签: xml validation dtd

我是xml写作的首发,我遇到了问题。我有基地dtd叫人,我在训练师和公司都使用它作为实体。我也有训练根元素,在这个根元素我要么有训练师或公司。当我尝试验证xml文件时,我面临一个错误“元素'人'已被声明。” 。如何保持我的结构不变并验证我的xml文件。顺便说一句,我使用实体形式来重用我的person.dtd。 谢谢您的帮助。

这是文件“person.dtd”:

<!ELEMENT person (id, name, lastname, 
                  telNo, adress, birthday, 
                  email)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT telNo (#PCDATA)>
<!ELEMENT adress (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT email (#PCDATA)>

这是文件“trainer.dtd”:

<!ELEMENT trainer (trainerPerson,proficiency)> 
<!ENTITY % trainerPerson SYSTEM "person.dtd">
%trainerPerson;
<!ELEMENT proficiency (#PCDATA)>

这是“company.dtd”:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT company (companyId, companyName, 
                   companyAdress, telno, contactPerson)>
<!ELEMENT companyId (#PCDATA)>
<!ELEMENT companyName (#PCDATA)>
<!ELEMENT companyAdress (#PCDATA)>
<!ELEMENT telno (#PCDATA)>
<!ENTITY % contactPerson SYSTEM "person.dtd">
%contactPerson;

这是培训信息的DTD:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT trainning  (trainningId, cost, date, duration, 
                      trainningName, comment,
                      durationtype, (trainer|company) )>
<!ELEMENT trainningId (#PCDATA)>
<!ELEMENT cost (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT duration (#PCDATA)>
<!ELEMENT trainningName (#PCDATA)>
<!ELEMENT durationtype (#PCDATA)>
<!ENTITY % trainer SYSTEM "trainer.dtd">
%trainer;
<!ENTITY % company SYSTEM "company.dtd">
%company;

1 个答案:

答案 0 :(得分:1)

我猜您显示的材料位于系统中的单独文件中,我已编辑您的问题以明确说明 - 如果我误解了您的问题,请更正更改!

这里有两件事值得注意。

首先,DTD文件不是XML文档,因此您不需要(也不应该使用)DTD文件开头的XML声明。你应该删除company.dtd和trainning.dtd的第一行。

其次,XML DTD最多只能包含任何给定名称的一个元素声明。由于'person'元素在person.dtd中声明并包含在trainer.dtd和company.dtd中,当您在trainingning.dtd文件中嵌入trainer.dtd和company.dtd时,您将使解析器看到两个声明'人'。

如果你真的想在这里创建三个不同的DTD,内容重叠,那么最简单的解决方案是制作一组包含元素声明的文件,以及第二组驱动文件只是声明参数实体并引用它们。所以person.dtd,company.dtd,trainer.dtd和training.dtd都只有元素声明,你将有三个驱动文件,一个用于公司,一个用于培训,一个用于培训,如下所示:

Companies.dtd包含:

<!ENTITY % company SYSTEM "company.dtd">
%company;
<!ENTITY % person SYSTEM "person.dtd">
%person;

Trainer.dtd包含:

<!ENTITY % trainer SYSTEM "trainer.dtd">
%trainer;
<!ENTITY % person SYSTEM "person.dtd">
%person;

Training.dtd包含:

<!ENTITY % company SYSTEM "company.dtd">
%company;
<!ENTITY % person SYSTEM "person.dtd">
%person;
<!ENTITY % trainer SYSTEM "trainer.dtd">
%trainer;

当然,更简单的方法是使用单个文件。