0

我是 xml 写作的初学者,我有一个问题。我有一个名为 person 的基础 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)>

这是“公司.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;
4

1 回答 1

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;

当然,更简单的方法是对所有内容使用单个文件。

于 2013-02-25T00:39:12.097 回答