我是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;
答案 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;
当然,更简单的方法是使用单个文件。