对于给定的XML文件,此DTD错误吗?

时间:2018-08-18 08:53:54

标签: xml dtd xml-validation

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代码而不会出现任何错误?

1 个答案:

答案 0 :(得分:1)

由于genderdescriptionproduct元素)和image的ATTLIST声明,您的DTD无效。 enumerations中的值不应加引号。

此外,这些值应该是有效的NMTOKEN(名称标记)类型,这意味着它们不能包含空格(因此Extra Large必须成为ExtraLarge,{{1} }等)(在DTD和XML实例中)。

因此,要修改DTD以使XML有效,则需要将ATTLIST声明更改为:

Extra_Large

请注意,我将属性设为必需的(<!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(可选),也可以给它们提供默认值(用引号引起来)。有关更多信息,请参见https://www.w3.org/TR/REC-xml/#sec-attr-defaults

您还需要从“特大”中更改#IMPLIED属性值。

另一件事;在XML中,您将“男士”和“女士”用作description属性的值。您需要将其更改为“男性”和“女性”。

我还注意到,您在gender元素的属性中使用了默认值。这没有道理。如果您有第二种商品不是“开衫毛衣”,会发生什么?

我认为您应该将这些声明更改为:

product

请注意,我将两个声明合并为一个,并对其进行了格式化以提高可读性。在我看来,这不是必需的,但确实使其更易于阅读。

最后一件事;在<!ATTLIST product description CDATA #REQUIRED product_image CDATA #REQUIRED> 上对image进行枚举也没有道理。您必须为其中列出的每个产品提供每张图片。也许将其更改为:

color_swatch

更新了DTD (也将ATTLIST声明移到了相应的ELEMENT声明下。这只是个人喜好。)

<!ATTLIST color_swatch image CDATA #REQUIRED>

更新的XML

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