【问题标题】:XML Namespaces and DTD validationXML 命名空间和 DTD 验证
【发布时间】:2010-11-02 16:54:21
【问题描述】:

我在 xml 和 dtd 中制作了一些文档。我在 xml html 命名空间中使用来插入图像。但是我可以使用 xmllint 验证我的文档,但我不知道为什么 :/ 验证器在第一行停止。 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html:catalog SYSTEM "catalog.dtd">
        <?xml-stylesheet type="text/css" href="style.css" ?>
          <catalog xmlns:html="http://www.w3.org/1999/xhtml">
            <catalogDescription>
              <authors>Autorzy:
                <author age="21">&autor1;</author>
                <author age="21">&autor2;</author>
              </authors>
              <catalogInfo>Katalog zawiera spis gier które posiadamy w sprzedaży w naszym sklepie z grami.</catalogInfo>
            </catalogDescription>
                <games>
    <!-- some data-->
        </games>
              </catalog>

DTD 文件:

<!ELEMENT html:catalog (catalogDescription,games)>
    <!ELEMENT catalogDescription (authors?,catalogInfo?)>
        <!ELEMENT authors (author+)>
            <!ELEMENT author (#PCDATA)>
        <!ELEMENT catalogInfo (#PCDATA)>



    <!ELEMENT games (genres,game+)>
        <!ELEMENT genres (genreType) #REQUIRED>
                <!ATTLIST genreType id ID #REQUIRED>
        <!ELEMENT game (title,more)>
            <!ATTLIST game lang #IMPLIED>
            <!ELEMENT more (screen, description, genre, rank, platforms,cost)>
                <!ATTLIST genre ref  IDREF #REQUIRED>
                <!ELEMENT cost (#PCDATA) >

                <!ELEMENT title (#PCDATA)>
                    <!ELEMENT rank EMPTY>
                    <!ATTLIST rank points CDATA #REQUIRED>
                <!ELEMENT description (#PCDATA)>
                <!ELEMENT platforms (platform+)>
                    <!ELEMENT platform>

                <!ELEMENT screen (thumbnail,bigimage)>
                    <!ELEMENT thumbnaul (html:img)>
                        <!ELEMENT html:img #EMPTY>
                        <!ATTLIST html:img src CDATA>
                    <!ELEMENT bigimage (html:img)>
                <!ELEMENT available (#PCDATA) >

【问题讨论】:

  • 您的 DTD 有一些错误...另外,这不是嵌入 XHTML 模式的方法。
  • 我主要为他更正了 DTD。无论如何,这不是一个好方法,命名空间 + DTD 总是会导致某些地方出现问题。

标签: xml dtd xml-namespaces


【解决方案1】:

如果您需要命名空间,您真的应该使用架构作为开始(W3C Schema 或 RelaxNG)。 DTD 不支持命名空间。可以将它们添加到其中,但这确实是一种 hack,您需要非常小心才能使它们正常工作。

现在,您的第一个问题可能是您的 DTD 中存在大量错误。这是带有一些 cmets 的更正版本。这仍然不是一个可以正确使用命名空间的 DTD,但我们会解决这个问题:

<!ELEMENT html:catalog (catalogDescription,games)>    
<!ELEMENT catalogDescription (authors?,catalogInfo?)>    
<!ELEMENT authors (author+)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT catalogInfo (#PCDATA)>
<!ELEMENT games (genres,game+)>

<!-- #REQUIRED is not applicable to elements -->
<!ELEMENT genres (genreType)>
<!ATTLIST genreType id ID #REQUIRED>
<!ELEMENT game (title,more)>

<!-- attributes must have a type -->
<!ATTLIST game lang CDATA #IMPLIED>
<!ELEMENT more (screen, description, genre, rank, platforms,cost)>
<!ATTLIST genre ref  IDREF #REQUIRED>
<!ELEMENT cost (#PCDATA) >

<!ELEMENT title (#PCDATA)>
<!ELEMENT rank EMPTY>
<!ATTLIST rank points CDATA #REQUIRED>
<!ELEMENT description (#PCDATA)>
<!ELEMENT platforms (platform+)>

<!-- this element doesn't make sense - it must have content of some sort, 
    I've made it empty but it's your data! -->
<!ELEMENT platform EMPTY>
<!ELEMENT screen (thumbnail,bigimage)>

<!-- I assume that you meant thumbnail  -->
<!ELEMENT thumbnail (html:img)>

<!-- that's EMPTY not #EMPTY  -->
<!ELEMENT html:img EMPTY>

<!-- the attribute must have the #REQUIRED, #FIXED, etc statement -->
<!ATTLIST html:img src CDATA #REQUIRED>
<!ELEMENT bigimage (html:img)>
<!ELEMENT available (#PCDATA) >

现在,由于 DTD 没有任何命名空间的概念,您需要将该命名空间声明为属性。我们可以通过添加以下内容将其作为目录元素的属性添加到 DTD:

<!ATTLIST catalog xmlns:html CDATA #FIXED "http://www.w3.org/1999/xhtml">

完成后,我们需要删除几个前缀。首先,不需要在目录元素上加上前缀,这样就可以从 DTD 中出来:

<!ELEMENT catalog (catalogDescription,games)>    

您不是(我希望)试图将您的目录元素添加到 XHTML,您正在尝试将 XHTML 的一部分添加到您的目录中。因此,您的 XML 文档现在可以重写为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<?xml-stylesheet type="text/css" href="style.css" ?>
<catalog xmlns:html="http://www.w3.org/1999/xhtml">
    <catalogDescription>
        <authors>Autorzy:
            <author age="21">autor1</author>
            <author age="21">autor2</author>
        </authors>
        <catalogInfo>Katalog zawiera spis gier które posiadamy w sprzedaży w naszym sklepie z grami.</catalogInfo>
    </catalogDescription>
    <games>
        <!-- some data-->
    </games>
</catalog>

现在验证了文档的初始部分(如果不是全部),并且可能首先完成了更多您想要的操作。您的 DTD 仍然不完整,因此无法验证(您需要先声明 age 属性)。

重要的是要意识到您尚未创建可识别名称空间的 DTD - 您已创建了一个 DTD,其中某些元素的名称中包含冒号,这在某些方面并非无效。我强烈建议您使用模式而不是 DTD。您将获得完整的命名空间意识,并且可以简单地从 XHTML 模式文件中导入定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2015-05-13
    相关资源
    最近更新 更多