J'écris du code Delphi avec RAD Studio XE7. Dans l'un de mes projets, j'ai besoin d'analyser plusieurs fichiers SVG pour dessiner leur contenu à l'écran. Pour cela, j'utilise l'analyseur TXMLDocument.Delphi - TXMLDocument peut-il être configuré pour ignorer les entités DTD incorrectes?
Une de mes sources SVG contient ces données 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>
Je sais que le contenu du XML ci-dessus est incomplet, et doit contenir SVG bien formaté ces données XML au lieu:
<?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>
Cependant, dans mon cas, les entités DTD ne sont pas pertinentes (je ne fais rien avec elles), et seule la partie de la balise svg m'intéresse. Cependant, si j'essaie de charger un tel XML, l'analyseur TXMLDocument soulève une exception "Référence à l'entité non définie 'ns_extend'" et refuse de charger le fichier SVG. Donc, ma question est, y at-il un moyen d'aviser l'analyseur TXMLDocument que les entités DTD devraient être simplement ignorées si elles sont corrompues, et forcer l'analyseur à continuer à lire le document en silence? Ou la seule façon de le faire est de pré-traiter le XML, et de détecter et supprimer de telles corruptions? (Note: Je veux éviter les pré-fosses si possible.) Les SVG peuvent provenir de n'importe où, certains d'entre eux peuvent contenir des corruptions mineures ou lourdes, et je veux qu'un maximum soit traité de la manière la plus générique possible Commencer à ajouter des règles spéciales pour tous les cas spéciaux possibles est une manière douloureuse, je préférerais grandement que l'analyseur TXMLDocument puisse ignorer ce type d'erreur.)
Qu'en est-il de l'ajout de la référence d'entité désirée avant de l'analyser? –
Je veux éviter le pré-prossessing si possible. Les SVG peuvent provenir de n'importe où, certains d'entre eux peuvent contenir des corruptions petites ou lourdes, et je veux qu'un maximum soit traité de la manière la plus générique possible. Commencer à ajouter des règles spéciales pour tous les cas spéciaux possibles est une manière douloureuse. Je préférerais grandement que l'analyseur TXMLDocument puisse ignorer ce type d'erreur. –
L'analyse XML est une opération stricte, AFIAK il n'y a pas d'options pour ignorer doctypes et espaces de noms. Vous devrez pré-traiter le XML ... – whosrdaddy