2017-02-17 29 views
0

Я пишу код Delphi с RAD Studio XE7. В одном из моих проектов мне нужно разобрать несколько файлов SVG, чтобы нарисовать их содержимое на экране. Для этого я использую синтаксический анализатор TXMLDocument.Delphi - Может ли 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 нет параметров игнорировать доктрисы и пространства имен. Вам нужно предварительно обработать 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 (то же имя метода и имя свойства, полностью аналогичное, не нужно переделывать ваш код), которые работают в 100 раз быстрее, чем TXMLDocument, и используют гораздо меньше памяти (Txmldocument хуже вы можете найти) .. и что игнорировать DTD :)

+0

Благодарим вас за ответ. Можете ли вы указать имена альтернативных парсеров, упомянутых выше? –

+0

Попробуйте, например, TalXmlDocument (https://sourceforge.net/projects/alcinoe/), это демо-версия внутри скамьи TxmlDocument, и вы можете видеть, насколько плох txmldocument. Их также много другого синтаксического анализатора xml, рядом со всеми из них лучше, чем Txmldocument –

+0

Хорошо, я это увижу, большое спасибо –