我正在用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解析器能夠忽略這種錯誤。)
在解析它之前添加所需的實體引用如何? –
如果可能的話,我想避免先發制人。 SVG可能來自任何地方,其中一些可能包含小型或嚴重腐敗,我希望儘可能以最通用的方式處理最大限度的問題。開始爲所有可能的特殊情況添加特殊規則是一種痛苦的方式。我非常喜歡TXMLDocument解析器能夠忽略這種錯誤。 –
XML解析是一項嚴格的操作,AFIAK沒有選項可以忽略doctype和名稱空間。你將不得不預處理XML ... – whosrdaddy