2017-02-17 64 views
0

我正在用RAD Studio XE7編寫Delphi代碼。在我的一個項目中,我需要解析幾個SVG文件以在屏幕上繪製其內容。爲此,我使用TXMLDocument解析器。德爾福 - TXMLDocument可以配置爲忽略不正確的DTD實體嗎?

我的一個來源SVG的包含此XML數據:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Generator: Adobe Illustrator 17.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" id="Calque_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" 
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px" height="32px" 
viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve"> 
<metadata> 
    <sfw xmlns="&ns_sfw;"> 
     <slices></slices> 
     <sliceSourceBounds height="21.334" width="32" bottomLeftOrigin="true" y="1.833" x="-4.501"></sliceSourceBounds> 
    </sfw> 
</metadata> 
<path fill="#29ABE2" d="M4,8h24v13.333h2.667v-16H1.334v16h2.667L4,8L4,8z M21.333,22.667c-0.256,0.536-1.527,0.967-2.667,1.181V24 
h-5.333v-0.152c-1.14-0.215-2.411-0.645-2.667-1.181H-0.001V24c0,1.467,4,2.667,4,2.667h24c0,0,4-1.2,4-2.667v-1.333H21.333 
L21.333,22.667z M26.667,25.333h-1.333V24h1.333V25.333z"/> 
</svg> 

我知道,上面的XML的內容是不完整的,並且格式正確SVG應該包含這個XML數據,而不是:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Generator: Adobe Illustrator 17.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ 
    <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/"> 
    <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/"> 
    <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/"> 
    <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/"> 
    <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/"> 
    <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/"> 
    <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/"> 
    <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/"> 
]> 
<svg version="1.1" id="Calque_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" 
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px" height="32px" 
viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve"> 
<metadata> 
    <sfw xmlns="&ns_sfw;"> 
     <slices></slices> 
     <sliceSourceBounds height="21.334" width="32" bottomLeftOrigin="true" y="1.833" x="-4.501"></sliceSourceBounds> 
    </sfw> 
</metadata> 
<path fill="#29ABE2" d="M4,8h24v13.333h2.667v-16H1.334v16h2.667L4,8L4,8z M21.333,22.667c-0.256,0.536-1.527,0.967-2.667,1.181V24 
h-5.333v-0.152c-1.14-0.215-2.411-0.645-2.667-1.181H-0.001V24c0,1.467,4,2.667,4,2.667h24c0,0,4-1.2,4-2.667v-1.333H21.333 
L21.333,22.667z M26.667,25.333h-1.333V24h1.333V25.333z"/> 
</svg> 

但是,就我而言,DTD實體是無關緊要的(我對它們什麼也不做),只有svg標籤中的部分對我感興趣。但是,如果我嘗試加載這樣的XML,TXMLDocument解析器會引發「引用未定義實體ns_extend'」異常,並拒絕加載SVG。

所以我的問題是,有沒有辦法通知TXMLDocument解析器,應該簡單地忽略DTD實體,如果損壞,並強制解析器繼續默默閱讀文檔?或者唯一的方法是預處理XML,並檢測並消除這種損壞? (注意:如果可能的話,我想避免先佔優勢,SVG可能來自任何地方,其中一些可能包含較小或較重的腐敗,我希望儘可能以最通用的方式處理開始爲所有可能的特殊情況添加特殊規則是一種痛苦的方式,我非常希望TXMLDocument解析器能夠忽略這種錯誤。)

+0

在解析它之前添加所需的實體引用如何? –

+0

如果可能的話,我想避免先發制人。 SVG可能來自任何地方,其中一些可能包含小型或嚴重腐敗,我希望儘可能以最通用的方式處理最大限度的問題。開始爲所有可能的特殊情況添加特殊規則是一種痛苦的方式。我非常喜歡TXMLDocument解析器能夠忽略這種錯誤。 –

+0

XML解析是一項嚴格的操作,AFIAK沒有選項可以忽略doctype和名稱空間。你將不得不預處理XML ... – whosrdaddy

回答

0

使用TXMLDocument它們是無法忽略DOCTYPE的,只有這樣才能編輯xml文件,然後用TXMLDocument解析並從中手動刪除它。

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ 
    <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/"> 
    <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/"> 
    <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/"> 
    <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/"> 
    <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/"> 
    <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/"> 
    <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/"> 
    <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/"> 
]> 

,但它們是一些其他的xml解析器,它們與Txmldocument(相同的方法名稱和屬性名稱,完全相似,不需要重做代碼)完全相似,其工作速度比TXMLDocument快100倍,並且使用的內存少得多(Txmldocument更糟糕你可以找到)..並忽略DTD :)

+0

謝謝您的回覆。你能否提供你上面提到的替代解析器的名字? –

+0

嘗試使用示例TalXmlDocument(https://sourceforge.net/projects/alcinoe/),它們是一個用於替換TxmlDocument的演示程序,您可以看到自己的txmldocument有多糟糕。他們也是很多其他的XML解析器,接近他們都比TXmldocument – 2017-02-18 16:42:41

+0

好,我會看到,非常感謝你 –