2010-11-02 106 views
0

我做的XML DTD和一些文件。我在xml html命名空間中使用插入圖像。但是我可以用xmllint來驗證我的文檔,我不知道爲什麼:/ validator在第一行停止。 XML文件:XML命名空間和DTD驗證

<?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) > 
+0

你DTD有一些錯誤......而且,這並不是嵌入XHTML架構的方式。 – 2010-11-02 23:34:40

+0

我主要爲他糾正了DTD。無論如何,這並不是一個好方法,名稱空間+ DTD總是會導致問題出現。 – 2010-11-03 11:22:13

回答

3

如果您需要的命名空間,你真的應該使用的一個開始(或者W3C SchemaRelaxNG)的模式。名稱空間不受DTD支持。他們可以添加到他們,但它確實是一個黑客,你需要照顧很大,以使他們的工作。

現在,你的第一個問題可能是大量的DTD錯誤。這裏有一些修改後的版本和一些評論。這仍然不是將要與命名空間正常工作一個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"> 

做完,我們需要刪除幾個前綴。首先,有沒有必要有catalog元素的前綴,以便可以從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模式文件導入定義。