2017-02-13 88 views
0

我正在使用RAD Studio XE7。在德爾福包我創建,我需要解析包含以下SVG數據的XML:Delphi - 包,XML解析和DTD

<!-- Generator: Adobe Illustrator 15.0.0, 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="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="141.73px" height="141.73px" viewBox="0 0 141.73 141.73" enable-background="new 0 0 141.73 141.73" xml:space="preserve"> 
    <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="67.6445" y1="90.6875" x2="99.4551" y2="90.6875"> 
     <stop offset="0" style="stop-color:#26B5E3"/> 
     <stop offset="0.4887" style="stop-color:#3FBEED;stop-opacity:0.5113"/> 
     <stop offset="1" style="stop-color:#47C1F1;stop-opacity:0"/> 
    </linearGradient> 
    <path fill="url(#SVGID_1_)" d="M94.25,82.792l5.205-4.868c-3.235,14.581-16.266,25.527-31.811,25.527v-9.033c10.257,0,19.001-6.592,22.22-15.765L94.25,82.792z"/> 
    <path fill="#26B5E3" d="M99.479,63.931C96.303,49.282,83.23,38.279,67.645,38.279c-17.966,0-32.589,14.616-32.589,32.582c0,17.967,14.624,32.59,32.589,32.59v-9.033c-12.99,0-23.557-10.566-23.557-23.557c0-12.982,10.567-23.55,23.557-23.55c10.567,0,19.534,7.004,22.507,16.604l-15.937-0.042l10.017,9.46l5.633,5.32l4.386,4.139l5.205-4.868l4.854-4.549l10.065-9.411L99.479,63.931z"/> 
</svg> 

在我的包,我用下面的代碼讀取XML文檔:

uses ..., Xml.XMLIntf, Xml.XMLDoc, Xml.Win.msxmldom, ... 

var 
    pDocument: IXMLDocument; 
    ... 
begin 
    ... 
    // load file 
    pDocument := LoadXMLDocument(fileName); 
    ... 
end; 

此代碼工作得很好,而XML不包含以下行:這一行的XML我得到一個錯誤

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 

不過:「DTD禁止」

我知道這個錯誤是衆所周知的,並添加以下行應該解決這個問題:

Xml.Win.msxmldom.MSXMLDOMDocumentFactory.AddDOMProperty('ProhibitDTD', False); 

而且是這種情況:當XML被加載時不再產生錯誤。然而,我的文檔的所有內容似乎都被破壞了:一些節點鬆開了他們的名字,所有的屬性內容都是空的......如果我在我的軟件包代碼中註釋AddDOMProperty('ProhibitDTD',False),這種奇怪的行爲就不會發生如果我手動刪除源XML中包含DTD的行。此外,即使在使用AddDOMProperty('ProhibitDTD',False)代碼時,在exe文件中編譯的相同代碼也可以很好地工作。

所以我的問題是:

  1. 我做錯了嗎?爲什麼當我激活包代碼中的AddDOMProperty('ProhibitDTD',False)時,我的XML文檔被完全破壞了?
  2. 對於在包內執行的代碼,解決「禁止DTD」問題的正確方法是什麼? (請與實施例)

問候

+0

預處理XML並刪除doctype並添加一個有效的xml序言? – whosrdaddy

+0

whorsdaddy,謝謝你的回答。我已經考慮過這個選擇,但這將是我將應用的最少的一個,首先是因爲我面臨的問題可能是一個更深層問題的信號,其次是因爲我認爲忽略問題是更好的方式來遇到許多其他問題我的路。爲此,我更願意瞭解在應用變通方法之前發生的情況。 –

回答

0

好的,我發現這個問題的根源。事實上,我犯了一個嚴重的錯誤。加載XML後,我試圖讓第一點是這樣的:

pNode := pDocument.ChildNodes['svg']; 

相反,得到這樣說:

pNode := pDocument.DocumentElement; 

我注意到這個問題走了,我的所有節點的數據均他們的正確位置。

+0

下次給所有的細節,我可以告訴你這個... – whosrdaddy

+0

是的,你是對的,對不起。我錯誤地認爲問題位於加載進程本身,而不是在解析之後。 –