0

嗨,我是 xml 和 DTD 的新手……我 2 小时前刚从课堂上学到这个……我用 DTD 制作了一个 XML。我只是想知道我的 XML 代码的 DTD 是否正确?

DTD:

< !DOCTYPE BusinessCard[

    <!ELEMENT BusinessCard (Name?,Phone+,Email?)>
    <!ELEMENT Name (#PCDATA)>
    <!ELEMENT Phone (#PCDATA)>
    <!ATTLIST Phone type CDATA "mobile">
    <!ATTLIST Phone type CDATA "work">
    <!ATTLIST Phone type CDATA "fax">
    <!ELEMENT Email (#PCDATA)>
]>

XML:

< BusinessCard>

    <Name >Jose P. Rizal</Name>

    <Phone type="mobile">(415)555-4567</Phone>

    <Phone type="work">(800)555-9876</Phone>

    <Phone type="fax">(515)555-1234</Phone>

    <Email>joserizal@email.com</Email>

</BusinessCard>
4

1 回答 1

3

您的 DTD 在语法上是合法的,并且文档对 DTD 有效,但是Phone元素上type属性的三重声明可能并不意味着您想要它的意思。给定属性的第一个声明优先,所以你所拥有的相当于

<!ATTLIST Phone type CDATA "mobile">

这意味着Phone可以采用类型属性,其值可以是任何字符数据(因此:任何可在 XML 中表达的字符串),其默认值为“ mobile”。忽略以下两个对具有不同默认值的相同属性的重新声明。

如果您要说该属性可以采用值“ mobile”、“ work”或“ fax”而没有其他值,那么您要使用的是枚举类型:

<!ATTLIST Phone type (mobile | work | fax) "mobile">

如果你想说的是属性可以取任何值,但是“mobile”、“work”和“fax”这些值是众所周知的值,软件应该为它们准备好,那么你需要用散文说; 没有办法在 DTD 表示法中这么说。你可以通过给 Phone 两个属性( typeothertype )说类似的话,规则type可以在你的练习中取三个值,也可以取值“ other”,而othertype属性取任何字符串作为值,并且只有当 时才有意义type="other"。因此可以标记家庭电话号码<Phone type="other" othertype="home">...</Phone>

<!ATTLIST Phone type (mobile | work | fax | other) #REQUIRED
                othertype CDATA #IMPLIED >
于 2012-10-01T23:53:34.290 回答