如何在DTD上声明具有相同名称(在XML上)的元素?

时间:2015-12-28 00:05:13

标签: xml dtd

我是XML和DTD的初学者,我无法理解一件事。 如何在DTD上声明具有相同名称(在XML上)的元素?这是我的XML文件,看看我的意思。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE family SYSTEM "family.dtd">
<family> 
  <Name>
    <FirstName>George</FirstName>
    <LastName>Costanza</LastName>
  </Name>
  <Name>
    <FirstName>Jerry</FirstName>
    <FirstName>Allen</FirstName>
    <LastName>Seinfeld</LastName>
    <Phone>0522-112233</Phone>
  </Name>
  <Name>
    <FirstName>Elaine</FirstName>
    <LastName>Benes</LastName>
    <Phone>0522-998877</Phone>
    <Phone>070-100101</Phone>
    <vip></vip>
  </Name>
</family>

正如您所看到的,“名称”元素被多次使用。我在我的DTD上尝试了这个,但它当然说已经声明了元素Name。

<!ELEMENT family (Name+)>
<!ELEMENT Name (FirstName, LastName)>
<!ELEMENT FirstName(#PCDATA)>
<!ELEMENT LastName(#PCDATA)>
<!ELEMENT Name (FirstName, FirstName, LastName, Phone)>

那我该如何解决这个问题呢?我希望自己清楚明白。

1 个答案:

答案 0 :(得分:1)

您的DTD对Name有不同的定义,这没有用。您可能希望使其中一些能够出现零次,例如

<!ELEMENT family (Name+)>
<!ELEMENT Name (FirstName+, LastName, Phone*)>
<!ELEMENT FirstName (#PCDATA)>
<!ELEMENT LastName (#PCDATA)>

其中+声明命名元素将在块中出现一次或多次,*声明命名元素将出现零次或多次。如果你没有任何量词,那么命名元素只会出现一次。

另请注意,您在某些元素名称和内容类型之间缺少空格,例如FirstName(#PCDATA)

最后,vip的开头标记在哪里?