2017-02-13 20 views
0

Я работаю с RAD Studio XE7. В пакете Delphi я создаю, мне нужно, чтобы разобрать XML, содержащий следующие данные: SVGDelphi - пакет, разбор 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 не содержит следующую строку:

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

Однако с этой строкой в ​​XML, я получаю сообщение об ошибке: «DTD запрещен»

Я знаю, что эта ошибка хорошо известна, и добавив следующую строку следует решить вопрос:

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

И это не так: Ошибка больше не генерируется во время загрузки XML. Однако все содержимое моего документа кажется поврежденным: некоторые узлы теряют свои имена, все содержимое атрибутов всегда пустое ... Это странное поведение никогда не происходит, если я комментирую AddDOMProperty ('ProhibitDTD', False) в моем коде пакета и если я вручную удалю строку, содержащую DTD, в моем исходном XML. Кроме того, тот же код, скомпилированный внутри exe вместо пакета, работает хорошо, даже при использовании кода AddDOMProperty ('ProhibitDTD', False).

Так что мои вопросы:

  1. Что я делаю неправильно? Почему мой XML-документ полностью сломан, когда я активирую AddDOMProperty ('ProhibitDTD', False) внутри моего кода пакета?
  2. Каков правильный способ устранения проблемы «DTD запрещен» для кода, выполняемого внутри пакета? (Пожалуйста, с примерами)

С уважением

+0

Предварительно обрабатывать XML и удалять doctype и добавлять действительный пролог xml? – whosrdaddy

+0

whorsdaddy, спасибо за ваш ответ. Я уже рассмотрел этот вариант, но это будет самое меньшее, что я буду применять, во-первых, потому что проблема, с которой я сталкиваюсь, может быть сигналом более глубокой проблемы, во-вторых, потому что я считаю, что игнорировать проблему - это лучший способ встретить много других на моя дорога. Для этого я предпочитаю понимать, что происходит здесь, прежде чем применять обходное решение. –

ответ

0

Ok, я нашел источник проблемы. Фактически, я совершил грубую ошибку. После загрузки XML, я пытался получить первый узел таким образом:

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

Вместо получать это так:

pNode := pDocument.DocumentElement; 

Я заметил, что вопрос ушел, и все мои данные узлы были в их правильное местоположение.

+0

В следующий раз дайте все подробности, я мог бы вам сказать это ... – whosrdaddy

+0

Да, вы правы, извините. Я ошибочно полагал, что проблема была обнаружена в самом процессе загрузки, а не в синтаксическом анализе. –