J'ai un fichier XML de 100 + MB (sans-DTD / Schema). XSLT ne l'aura pas. Stratégies de transformation / analyse?

StackOverflow https://stackoverflow.com/questions/149474

  •  02-07-2019
  •  | 
  •  

Question

Ce fichier XML contient des nouvelles archivées pour l’année dernière. On m'a demandé de classer ces histoires par catégories d'histoire dans de nouveaux fichiers XML.

big_story_export.xml

se transforme en

lifestyles.xml
food.xml
nascar.xml

... et ainsi de suite.

Le travail a été effectué à l'aide d'un script Python unique, cependant , je l'avais initialement tenté avec XSLT . Cela a provoqué de la frustration alors que mes sélections XPATH craquaient le lit. Les fichiers de test ont été transformés à la perfection, mais le gros fichier contre ma feuille de style a abouti à ... rien .

Quelles stratégies recommandez-vous pour vous assurer que des fichiers comme celui-ci seront exécutés via XSLT? Ce document m'a été remis par un fournisseur, alors imaginez que je n'ai pas beaucoup de poids pour définir la structure de ce fichier.

Si vous voulez des exemples de code, je vais en mettre quelques-uns.

En tout état de cause, je serais satisfait de quelques astuces pour faire en sorte que XML + XSLT fonctionnent ensemble de manière fluide.

@Sklivvz

J'utilisais libxml2 & amp; de python libxslt pour traiter cela. Je cherche dans xsltproc maintenant.

Cela semble être un bon outil pour ces situations ponctuelles. Merci!

@ diomidis-spinellis

Il est bien formé, cependant (comme mentionné) je n'ai pas la faculté de découvrir sa validité.

Pour ce qui est d’écrire un schéma, j’aime l’idée.

Le temps que j'investirai pour faire valider ce fichier ne serait pas pratique s'il ne s'agissait que d'une opération ponctuelle, même si je prévois devoir traiter davantage de fichiers de ce type avec notre fournisseur.

Écrire un schéma (et le soumettre au fournisseur) constituerait une excellente stratégie à long terme pour gérer XML funk comme ceci. Merci!

Était-ce utile?

La solution

Cela ressemble à un bogue dans le fichier XML volumineux ou dans le processeur XSLT. Il y a deux choses que vous devriez vérifier dans votre dossier.

  1. Le fichier XML est-il bien formé? Autrement dit, toutes les balises et tous les attributs sont-ils correctement terminés et mis en correspondance? Un processeur XML, tel que xmlstarlet , peut vous en informer.
  2. Le fichier contient-il un code XML valide? Pour cela, vous avez besoin d’un schéma et d’un validateur XML ( xmlstarlet peut également remplir cette astuce). Je suggère que vous investissiez des efforts pour écrire la définition de schéma de votre fichier. Cela simplifiera beaucoup le débogage, car vous pourrez alors facilement localiser la source exacte des problèmes que vous pourriez rencontrer.

Si le fichier est bien formé et valide, mais que le processeur XSLT refuse toujours de vous donner les résultats escomptés, vous pouvez être sûr que le problème réside dans le processeur et vous devez en essayer un autre.

Autres conseils

Le problème lié à l'utilisation de XSLT pour traiter des documents XML arbitrairement volumineux est que le traitement XSLT commence par l'analyse du document d'entrée dans une arborescence source. Cet arbre est analysé dans la mémoire. Cela signifie que vous rencontrerez éventuellement un document d'entrée suffisamment volumineux pour poser des problèmes, même si vous utilisez un processeur XSLT robuste tel que Saxon et que vous disposez de beaucoup de mémoire virtuelle. (Cela peut toujours fonctionner, mais ce sera lent.)

Une autre raison de ne pas utiliser XSLT pour cela est que vous produisez plusieurs documents de sortie, ce qui (sur la base de ce que vous avez dit jusqu'à présent) signifie que vous effectuez plusieurs passages sur votre document d'entrée.

Il peut être préférable (en fonction de nombreux facteurs liés à votre situation que je ne connais pas) d’adopter une approche basée sur SAX plutôt que d’utiliser XSLT. En utilisant un processeur SAX, vous pourrez peut-être écrire une méthode qui consiste à faire passer en une seule fois le document source en avant, à l’analyser au fur et à mesure, et à écrire tous les documents de sortie lorsqu’il rencontre les éléments qui les contiennent. / p>

Quelle langue / quel analyseur utilisiez-vous?
Pour les gros fichiers, j'essaie d'utiliser des outils de ligne de commande Unix.
Elles sont généralement beaucoup, beaucoup plus efficaces que d’autres solutions et ne "déconnent" pas. sur des fichiers volumineux.

Essayez d’utiliser xsltproc

Puis-je recommander le processeur Saxon XSLT? Je sais pertinemment qu'il peut gérer des fichiers volumineux, à condition de laisser suffisamment de mémoire à la machine virtuelle Java.

Une autre chose est qu’il peut y avoir des optimisations sur votre XSLT qui pourraient vous aider, mais il est difficile de faire des déclarations générales sur des choses comme ça.

scroll top