2012-07-23 44 views
0

感謝您閱讀我的問題。我已經搜索並閱讀了類似的問題,但沒有一個能夠解釋發生了什麼。我是否錯誤地使用了.DTD,或者只是誤解它應該做什麼?

我有一個XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/css" href="../wikiStyle.css"?> 
<!DOCTYPE article SYSTEM "../article.dtd"> 

<article xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <header> 
     <title>Foreign relations of Malta</title> 
     <id>19146</id> 
    </header> 

    <bdy> 
     <link xlink:type="simple" xlink:href="../205/40205.xml">Albania</link>&nbsp;· 
     <link xlink:type="simple" xlink:href="../588/67588.xml">Andorra</link>&nbsp;· 
    </bdy> 
</article> 

正如你所看到的;我引用的.dtd文件,它包含了類似的定義:

<!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space, 
            U+00A0 ISOnum --> 

我的目的是要顯示在瀏覽器這個.xml文件,可讀取。 CSS完美地管理着這一點,除了像這樣的.xml文件,它包含像這樣的元素。

在這種情況下

,我得到一個錯誤,如:

XML Parsing Error: undefined entity 

10.1126/science.288.5472.1775</weblink>. PMID 10877698.</cite>&nbsp;</entry> 

--------------------------------------------------------------^ 

正如我的理解是,這條線在.dtd應宣佈該元素的瀏覽器,並讓我用& NBSP在我的XML(並經瀏覽器的解析器顯示擴展到&#160。

  • 我是正確的我明白了什麼應該來發生的事情,還是我MI什麼東西?
  • 我該如何聲明這個元素,以便它可以被瀏覽器顯示?

請注意:我正在處理數以百萬計的這些XML文件,並且我不生成它們。我需要一個不涉及更改.xml文件本身的解決方案。

回答

1

您的實體聲明看起來不錯,所以它可能是瀏覽器不加載外部DTD的問題。 (例如:https://developer.mozilla.org/en/XML_in_Mozilla

我認爲處理這個唯一的辦法是將實體聲明添加到每個文件的內部子集:

<!DOCTYPE article [ 
<!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space, 
            U+00A0 ISOnum --> 
]> 

我知道你說你有幾百萬的這些工作文件並且不生成它們,但是您可以編寫腳本更新DOCTYPE聲明並對其進行預處理。

+0

感謝您的幫助。您對問題的診斷是正確的,.dtd只是沒有被讀取。 至於解決方案,事實證明,內部.dtd爲每個文件添加30 + kb,這是行不通的。 目前我發現的最好的解決方案是懶散地手動解析我的文檔,並用每個元素的哈希代碼替換每個元素的每個實例。 – Paul 2012-07-24 13:35:13

+0

如果您對瀏覽器的主要關注點是它正確顯示文檔(即您正在單獨驗證),那麼您不需要內部子集中的完整DTD,只需要文檔中引用的實體的實體聲明。如果您願意接受某些手工作業,則可以像使用數字字符引用替換實體引用一樣方便地將實體聲明插入到內部子集中。 (如果手工工作變得太多,使用XSLT進行簡單的身份轉換是自動執行此類操作的簡單方法。) – 2012-08-21 19:17:22

+0

@ C.M.Sperberg-McQueen - 好評和我完全同意。我想知道保羅在評論中提到的30 + kb是否是所有的實體聲明,或者他是否添加了整個DTD。我認爲我的XML示例正在顯示您正在談論的內容;一個只有實體聲明的內部子集。我還刪除了公共和系統標識符。 – 2012-08-21 19:33:35

相關問題