0

私は xml の作成を始めたばかりで、問題があります。私は person と呼ばれるベース 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」です。

<!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;
4

1 に答える 1

1

あなたが表示している資料はあなたのシステム上の別のファイルにあると思います。私はあなたの質問を編集してそれを明確にしました-あなたの質問を誤解した場合は、変更を修正してください!

ここで注目すべき点が 2 つあります。

まず、DTD ファイルは XML 文書ではないため、DTD ファイルの先頭で XML 宣言を行う必要はありません (使用すべきではありません)。company.dtd と training.dtd の最初の行を削除する必要があります。

第 2 に、XML DTD には、任意の名前に対して最大 1 つの要素宣言を含める必要があります。「person」要素は person.dtd で宣言され、trainer.dtd と company.dtd に含まれているため、trainning.dtd ファイルにtrainer.dtd と company.dtd の両方を埋め込むと、パーサーに次の 2 つの宣言が表示されます。 '人'。

ここで内容が重複する 3 つの異なる DTD を本当に作成したい場合、最も簡単な解決策は、要素宣言のみを含むファイルのセットを 1 つ作成し、パラメーター エンティティを宣言して参照するだけのドライバー ファイルの 2 つ目のセットを作成することです。したがって、person.dtd、company.dtd、trainer.dtd、および training.dtd にはすべて要素宣言のみが含まれ、次のように、会社用、トレーナー用、およびトレーニング用の 3 つのドライバー ファイルが作成されます。

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;

もちろん、すべてに対して 1 つのファイルを使用する方が簡単です。

于 2013-02-25T00:39:12.097 に答える