Il existe une fonction de «vidage binary» ou de «représentation binary» dans LibXML2?

J’ai besoin d’accéder à la représentation binary interne d’un DOM XML chargé … Il existe quelques fonctions de vidage , mais je ne vois pas quelque chose comme “tampon binary” (il n’y a que des “tampons XML”).

Mon dernier objective est de comparer le même document , octet par octet, avant et après une procédure de boîte noire , directement avec leurs représentations binarys (actuelles et en cache), sans conversion (en représentation XML-texte) … Donc, la question,

Il existe une représentation binary (structures en mémoire) dans LibXML2, pour comparer le vidage avec les représentations actuelles ?

Il me suffit de vérifier si les DOM actuels et sous-jacents sont équivalents.


Détails

Ce n’est pas un problème de comparer deux objects DOM distincts , mais quelque chose de plus simple, car il n’est pas nécessaire de modifier les identifiants, etc. Il n’est pas nécessaire de recourir à une représentation canonique (!);

Entre “avant et après” il existe une procédure boîte noire , ex. une transformation d’identité XSLT qui affecte (ou non) certains nœuds ou atsortingbuts.

Solution alternative…

  1. … pour développer une fonction C pour LibXML2 qui compare les deux arbres, noeud par noeud, et renvoie false s’ils sont différents: lors du parcours de l’arbre, si la structure de l’arbre change ou si certains changements changent, l’algorithme arrête la comparaison ( retourne faux).

  2. … Pas l’idéal, mais aide quelques autres algorithmes: si je peux accéder (dans LibXML2) au nombre total de nœuds ou à la longueur ou taille totale ou md5 ou sha1 … Seulement pour optimiser les cas fréquents (pour mon application) où la comparaison retournera false en évitant la procédure de comparaison complète.


REMARQUES

Questions connexes

  • Comment vérifier si un DomDocument a été modifié avec une comparaison simple et rapide?
  • Comparaison octet par octet
  • libxml xmlNodePtr en chaîne xml brute?

Avertissement pour le lecteur utilisant les solutions répondues

Le problème est de “comparer avant avec après une opération de back-box”, mais il existe deux types de back-box ici :

  • Celles connues et contrôlables, comme les transformations XSLT ou l’utilisation d’une bibliothèque connue. Vous devez savoir que vos boîtes noires ne modifieront pas l’ordre des atsortingbuts ou le contenu de l’ID, ni ne dénormaliseront les espaces (ou autres).
  • Les versions totalement libres, comme l’utilisation d’un éditeur externe (par exemple, l’éditeur en ligne qui modifie un fichier XHTML), où l’utilisateur et le logiciel peuvent tout faire.

Je vais utiliser une solution dans un contexte de “boîte noire connue” . Ainsi, mes commentaires à la section “Détails” ci-dessus sont valides.

Dans un contexte de back-box “totalement libres”, vous ne pouvez pas utiliser une “comparaison de vidages binarys”, car seule une représentation canonique (C14N) est valide pour la comparaison. Pour comparer les critères C14N, seules les “solutions alternatives” (commentées ci-dessus) sont possibles. Pour l’option-1, vous devez notamment effectuer un sorting avant de comparer un ensemble de nœuds d’atsortingbut. Pour la variante 2 ( également abordée ici ), générer les vidages C14N.

PS: bien entendu, l’utilisation des critères C14N est subjective, dépend de l’application : si, p. ex., pour votre application “changer l’atsortingbut” est un changement valide / important, la comparaison qui le détecte est valide (!).

Voici les méthodes pertinentes de libxml2:

Il existe une méthode d’encodage base64 :

 Fonction: xmlTextWriterWriteBase64

 int xmlTextWriterWriteBase64 (rédacteur xmlTextWriterPtr, 
                      const char * data, 
                      int début, 
                      int len)

 Ecrivez un texte XML encodé en base64.
 writer: le xmlTextWriterPtr
 data: données binarys
 start: la position dans les données du premier octet à encoder
 len: le nombre d'octets à encoder
 Retourne: les octets écrits (peut être 0 en raison de la mise en mémoire tampon) ou -1 en cas d'erreur

et une méthode de codage BinHex :

 Fonction: xmlTextWriterWriteBinHex
 int xmlTextWriterWriteBinHex (xmlTextWriterPtr writer, 
                      const char * data, 
                      int début, 
                      int len)

 Écrivez un texte XML codé BinHex.
 writer: le xmlTextWriterPtr
 data: données binarys
 start: la position dans les données du premier octet à encoder
 len: le nombre d'octets à encoder
 Retourne: les octets écrits (peut être 0 en raison de la mise en mémoire tampon) ou -1 en cas d'erreur

Références

  • Module xmlwriter de libxml2

  • ChangeLog dernières entrées de libxml2

  • L’parsingur XML C et la boîte à outils de Gnome: API Alphabetic Index AB pour libxml2

  • Prise en charge des encodages libxml

  • binhex.py