2013-02-24 72 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