2013-02-24 98 views
0

我是xml写作的入门者,我遇到了问题。我有基地dtd叫人,我用它作为教练和公司的实体。我也有训练的根本元素,在这个根本元素中,我有教练或公司。当我尝试验证xml文件时,我遇到了一个错误“Element'person'已经被声明。” 。我怎样才能保持我的结构,并验证我的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

我想你展示的资料是在你系统上的单独文件中,并且我编辑了你的问题以便明确表达 - 如果我误解了你的问题,请更正这些更改!

这里有两件事值得注意。

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

其次,对于任何给定的名称,XML DTD必须至多包含一个元素声明。由于'person'元素是在person.dtd中声明的,并且包含在trainer.dtd和company.dtd中,所以当您将trainer.dtd和company.dtd嵌入到trainning.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; 

当然,更简单的做法是将一个文件用于一切。

+0

感谢您的回复,您的驱动文件是什么意思? – Eneramo 2013-02-25 06:21:50

+0

我的意思是像我的答案中显示的Company.dtd,Trainer.dtd,Training.dtd文件这样的文件,它除了嵌入其他文件外什么都不做,因此可以被认为是驱动创建有效的DTD你有可用的文件)。这些是您将从文档中引用的文件。例如,关于培训师的文档可能以这种方式开始:“<!DOCTYPE培训师系统”培训师。dtd“> ...'而有关公司的文档将开始'<!DOCTYPE company SYSTEM”Company.dtd“> ...' – 2013-02-25 16:23:36

+0

谢谢你的帮助我理解你的观点 – Eneramo 2013-02-25 20:23:33