Я пишу код 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 мог игнорировать такие ошибки.)
Как насчет добавления желаемой ссылки на объект перед ее разбором? –
Я хочу, если возможно, избегать предвыборной кампании. SVG могут появляться из любого места, некоторые из них могут содержать небольшие или тяжелые повреждения, и я хочу, чтобы максимум можно было решать самым общим способом. Начиная добавлять специальные правила для всех возможных особых случаев - это болезненный путь. Я бы очень хотел, чтобы анализатор TXMLDocument мог игнорировать такие ошибки. –
XML-синтаксический анализ - это строгая операция, AFIAK нет параметров игнорировать доктрисы и пространства имен. Вам нужно предварительно обработать XML ... – whosrdaddy