2012-10-01 69 views
0

嗨,我是xml和DTD的新手....我剛剛從2個小時前的課中學到了這一點...我用DTD製作了一個XML ..我只是想知道我的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>[email protected]</Email> 

</BusinessCard> 

回答

3

你的DTD在語法上是合法的,該文件是針對DTD有效,但型的三重聲明屬性電話元素可能不是m能夠達到你想要的含義。給定屬性的第一個聲明優先,所以你有什麼就相當於

<!ATTLIST Phone type CDATA "mobile"> 

這意味着電話可能需要類型屬性,其值可以是任意字符的數據(如此:任何字符串用XML表示),其默認值是「mobile」。以下兩個重新聲明具有不同默認值的相同屬性將被忽略。

如果您正在尋找地說,該屬性值可以取爲「mobile」,「work」,或「fax」,並沒有其他人,你想用的是一個枚舉類型:

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

如果你想說的是屬性可以取任何值,但是「移動」,「工作」和「傳真」這些值是衆所周知的值,並且應該爲他們準備軟件,那麼你需要以散文;在DTD符號中沒有辦法這麼說。你可以說通過給電話兩個屬性(OTHERTYPE),而類似的東西,與規則可以採取三個值中的鍛鍊​​,也值了「other」,而OTHERTYPE屬性將任何字符串作爲值,並且僅在type="other"時纔有意義。所以家庭電話號碼可以被標記爲<Phone type="other" othertype="home">...</Phone>

<!ATTLIST Phone type (mobile | work | fax | other) #REQUIRED 
       othertype CDATA #IMPLIED > 
+0

+1比目前接受的要好得多。 –

+0

你說_你的DTD在語法上是legal_,但是有一個工具(CLI或者web)來檢查這個嗎?沒有XML,只是爲了檢查DTD是否單獨語法;如果它形成良好。我找不到。 –

+0

任何驗證XML處理器都會報告DTD中的錯誤,因此任何此類處理器都應該可以正常工作,以作爲檢查DTD的工具。大多數情況下(默認情況下)假定您要求他們檢查XML文檔,因此如果您確實想檢查DTD,則可能需要提供僞文檔。 –