2017-02-17 1 views
0

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.)

+0

Qu'en est-il de l'ajout de la référence d'entité désirée avant de l'analyser? –

+0

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. –

+0

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

Répondre

0

Avec TXMLDocument, il est impossible d'ignorer le DOCTYPE, le seule façon que vous avez est de modifier le fichier XML avant de l'analyser avec TXMLDocument et retirer manuellement le

<!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/"> 
]> 

cependant, leur est un autre analyseur xml qui sont entièrement similaires à Txmldocument (même nom de méthode et nom de propriété, complètement similaire, pas besoin de refaire votre code) qui fonctionnent 100x plus vite que TXMLDocument et utilisent beaucoup moins de mémoire (Txmldocument est le pire vous pouvez trouver) .. et qui ignorent la DTD :)

+0

pour votre réponse. Pouvez-vous s'il vous plaît fournir les noms des analyseurs syntaxiques alternatifs que vous avez mentionnés ci-dessus? –

+0

Essayez par exemple TalXmlDocument (https://sourceforge.net/projects/alcinoe/), il s'agit d'une démo à l'intérieur de banc de TxmlDocument et vous pouvez vous voir à quel point txmldocument est mauvais. Leur est également beaucoup d'autres parser xml, à proximité de tous sont meilleurs que Txmldocument –

+0

Ok, je vais voir ça, merci beaucoup –