簡體   English   中英

對於給定的 XML 文件,此 DTD 是否錯誤

[英]Is this DTD wrong for the given XML file

XML (來自https://github.com/SMAPPNYU/ProgrammerGroup/blob/master/LargeDataSets/sample-xml.xml

<?xml version="1.0"?>
<?xml-stylesheet href="catalog.xsl" type="text/xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
    <product description="Cardigan Sweater" product_image="cardigan.jpg">
        <catalog_item gender="Men's">
            <item_number>QWZ5671</item_number>
            <price>39.95</price>
            <size description="Medium">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            </size>
            <size description="Large">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            </size>
        </catalog_item>
        <catalog_item gender="Women's">
            <item_number>RRX9856</item_number>
            <price>42.50</price>
            <size description="Small">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            </size>
            <size description="Medium">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
                <color_swatch image="black_cardigan.jpg">Black</color_swatch>
            </size>
            <size description="Large">
                <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
                <color_swatch image="black_cardigan.jpg">Black</color_swatch>
            </size>
            <size description="Extra Large">
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
                <color_swatch image="black_cardigan.jpg">Black</color_swatch>
            </size>
        </catalog_item>
    </product>
</catalog>

DTD

<!ELEMENT catalog (product)>
<!ELEMENT product (catalog_item+)>
<!ELEMENT catalog_item (item_number,price,size+)>
<!ELEMENT size (color_swatch+)>
<!ELEMENT item_number (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT color_swatch (#PCDATA)>


<!ATTLIST product description "Cardigan Sweater" CDATA>
<!ATTLIST product product_image "cardigan.jpg" CDATA>
<!ATTLIST catalog_item gender ("Mens"|"Womens") CDATA>
<!ATTLIST size description ("Small"|"Medium"|"Large"|"Extra Large") CDATA>
<!ATTLIST color_swatch image ("red_cardigan.jpg"|"burgundy_cardigan.jpg"|"navy_cardigan.jpg"|"black_cardigan.jpg") CDATA>

對於上面的 XML 代碼,我嘗試了如下 DTD,但我無法驗證它。 請檢查我的 DTD 有什么問題。 需要在 DTD 中進行哪些更改才能驗證 XML 代碼而不會出現任何錯誤?

由於針對genderdescriptionproduct元素)和image的 ATTLIST 聲明,您的 DTD 無效。 不應引用枚舉中的值。

此外,這些值應該是有效的NMTOKEN (名稱標記)類型,這意味着它們不能包含空格(因此Extra Large在 DTD 和 XML 實例中都需要變為ExtraLargeExtra_Large等)。

因此,要修改 DTD 以使 XML 有效,這些 ATTLIST 聲明需要更改為:

<!ATTLIST catalog_item gender (Mens|Womens) #REQUIRED>
<!ATTLIST size description (Small|Medium|Large|ExtraLarge) #REQUIRED>
<!ATTLIST color_swatch image (red_cardigan.jpg|burgundy_cardigan.jpg|navy_cardigan.jpg|black_cardigan.jpg) #REQUIRED>

請注意,我將屬性#REQUIRED必需 ( #REQUIRED ),但您可以將它們#IMPLIED (可選)或給它們一個默認值(將值括在引號中)。 有關更多信息,請參閱https://www.w3.org/TR/REC-xml/#sec-attr-defaults

您還需要從“Extra Large”更改description屬性值。

另一件事; 在您的 XML 中,您使用“Men's”和“Women's”作為gender屬性的值。 您需要將它們更改為“男士”和“女士”。

我還注意到您在product元素的屬性中使用了默認值。 這沒有意義。 當您擁有不是“開衫毛衣”的第二款產品時會發生什么?

我認為您應該將這些聲明更改為:

<!ATTLIST product 
    description   CDATA #REQUIRED 
    product_image CDATA #REQUIRED>

請注意,我將兩個聲明合二為一並進行了格式化以提高可讀性。 這不是必需的,但在我看來確實使閱讀更容易。

最后一件事; color_swatch上枚舉image也沒有意義。 您必須擁有其中列出的每個產品的每個圖像。 也許將其更改為:

<!ATTLIST color_swatch image CDATA #REQUIRED>

更新了 DTD (也將 ATTLIST 聲明移到了相應的 ELEMENT 聲明下。這只是個人偏好。):

<!ELEMENT catalog (product)>

<!ELEMENT product (catalog_item+)>
<!ATTLIST product 
    description   CDATA #REQUIRED 
    product_image CDATA #REQUIRED>

<!ELEMENT catalog_item (item_number,price,size+)>
<!ATTLIST catalog_item gender (Mens|Womens) #REQUIRED>

<!ELEMENT size (color_swatch+)>
<!ATTLIST size description (Small|Medium|Large|ExtraLarge) #REQUIRED>

<!ELEMENT item_number (#PCDATA)>
<!ELEMENT price (#PCDATA)>

<!ELEMENT color_swatch (#PCDATA)>
<!ATTLIST color_swatch image CDATA #REQUIRED>

更新的 XML

<?xml version="1.0"?>
<?xml-stylesheet href="catalog.xsl" type="text/xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
    <product description="Cardigan Sweater" product_image="cardigan.jpg">
        <catalog_item gender="Mens">
            <item_number>QWZ5671</item_number>
            <price>39.95</price>
            <size description="Medium">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            </size>
            <size description="Large">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            </size>
        </catalog_item>
        <catalog_item gender="Womens">
            <item_number>RRX9856</item_number>
            <price>42.50</price>
            <size description="Small">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
            </size>
            <size description="Medium">
                <color_swatch image="red_cardigan.jpg">Red</color_swatch>
                <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
                <color_swatch image="black_cardigan.jpg">Black</color_swatch>
            </size>
            <size description="Large">
                <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
                <color_swatch image="black_cardigan.jpg">Black</color_swatch>
            </size>
            <size description="ExtraLarge">
                <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
                <color_swatch image="black_cardigan.jpg">Black</color_swatch>
            </size>
        </catalog_item>
    </product>
</catalog>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM