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