2013-02-24 1 views
0

저는 XML 작성에 초보자이고 문제가 있습니다. 나는 사람이라고 부르는 기초 dtd가 있고 나는 조련사 및 회사 둘 다에있는 실재물로 그것을 이용한다. 나는 또한 루트 요소를 훈련시키고이 루트 요소에서 나는 트레이너 또는 회사 중 하나를 가지고있다. xml 파일의 유효성을 검사하려고 할 때 "요소 '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"

<?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; 
: 이것은 "company.dtd는"

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

입니다

그리고 이것은 훈련 정보를위한 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

+0

나는 내 대답에 나와있는 Company.dtd, Trainer.dtd, Training.dtd 파일과 같은 파일을 의미했지만, 다른 파일을 포함하지만 (따라서 다른 DTD의 효과적인 DTD 작성을 유도하는 것으로 생각할 수 있습니다. 사용할 수있는 파일). 이 파일은 문서에서 참조 할 파일입니다. 예를 들어 트레이너에 관한 문서는 다음과 같이 시작할 수 있습니다 :' ...'회사에 관한 문서는' ...' –

+0

당신의 도움을 주셔서 감사합니다. – Eneramo