9
votes

Comment puis-je diviser un grand fichier XML?

Nous exportons des "enregistrements" vers un fichier XML; L'un de nos clients s'est plaint du fait que le dossier est trop important pour que leur autre système traite. Par conséquent, j'ai besoin de diviser le fichier, tout en répétant la "section d'en-tête" dans chacun des nouveaux fichiers.

Alors je cherche quelque chose qui me permettra de définir des xpaths pour la section qui doit toujours être émise et une autre xpath pour les "lignes" avec un paramètre qui dit combien de lignes à mettre dans chaque fichier et Comment nommer les fichiers.

Avant de commencer à écrire un code personnalisé .NET pour le faire; existe-t-il un outil de ligne de commande standard qui fonctionnera sous Windows qui le fait ?

(Comme je sais comment programmer en C #, je suis plus inclus pour écrire du code, puis essayez de vous désordre avec le complexe XSL, etc., mais une solution "de la soi" serait meilleure que le code personnalisé.)


1 commentaires

Je ne connais pas d'un outil de ligne de commande conçu pour cela. Vous pourrez peut-être utiliser XSLT. Cependant, lorsque je devais avoir quelque chose de similaire, j'ai écrit un programme de Python personnalisé, comme Python était ma langue la plus confortable (et je n'étais pas utilisé XSLT depuis des années).


7 Réponses :


1
votes

Il n'y a rien de construit qui peut gérer cette situation facilement.

Votre approche semble raisonnable, bien que je démarrerais probablement avec un document "squelette" contenant les éléments qui doivent être répétés et générer plusieurs documents avec les "enregistrements".


mise à jour:

Après un morceau de creuser, j'ai trouvé Cet article décrit un façon de diviser des fichiers à l'aide de XSLT.


0 commentaires

3
votes

Il n'y a pas de solution à usage général à cela, car il existe tant de façons différentes possibles que votre source XML pourrait être structurée.

C'est assez simple de construire une transformation XSLT qui produira une tranche d'un document XML. Par exemple, étant donné ce XML: xxx

Vous pouvez émettre une copie du fichier contenant uniquement des éléments de données dans une certaine plage avec ce XSLT: < / p> xxx

(note, à la manière dont cela est basé sur la transformation d'identité, cela fonctionne même si en-tête n'est pas le niveau supérieur ELEMENT.)

Vous devez toujours compter les éléments DATA ÉLÉMENTS DANS LA SOURCE XML et exécutez la transformée à plusieurs reprises avec les valeurs de $ STARTPOSITION et < code> $ endposition qui convient à la situation.


2 commentaires

Une question de Daft, quel outil de ligne de commande serais-je utilisé pour exécuter ce XSLT?


Vous auriez besoin d'écrire votre propre programme pour l'exécuter - entre autres choses, le programme doit compter les éléments que vous êtes une pagination afin qu'il sache quand arrêter de s'arrêter.



-2
votes

"Y a-t-il un outil de ligne de commande standard qui fonctionnera sous Windows qui le fait?"

Oui. http://xponentsoftware.com/xmlsplit.aspx


0 commentaires

2
votes

xml_split - divisez d'énormes documents XML en petits morceaux

http://www.perlmonks.org/index.pl?node_id=429707 < / a>

http://metacpan.org/pod/xml::Twig


0 commentaires

4
votes

Télécharger pour la première fois Foxe XML Editor à partir de ce lien http://www.firstobject.com/foxe242.zip < / a>

regarder cette vidéo http://www.firstobject.com/ xml-séparateur-script-video.htm Vidéo explique comment fonctionne de code fractionné.

Il existe un code de script sur cette page (Démarre avec Split () ) Copiez le code et sur le programme Editeur XML fait un "nouveau programme "Sous le" fichier ". Collez le code et enregistrez-le. Le code est le suivant: xxx

modifie les champs gras marqués (ou ** ** ** marqués) pour vos besoins. (Ceci est également exprimé à la page vidéo)

sur la fenêtre Editeur XML Cliquez avec le bouton droit de la souris sur le bouton droit de la souris et cliquez sur l'exécution (ou simplement F9). Il y a une barre de sortie sur la fenêtre où il affiche le nombre de fichiers générés.

Remarque: Le nom du fichier d'entrée peut être "c: \\ utilisateurs \\ auser \\ bureau \\ auser \\ auser \\ auser \\ a_xml_file.xml" (Double tabas) et fichier de sortie "c: \\ utilisateurs \\ auser \\ bureau \\ anoutputfolder \\ pièce" + nfilecount + ".xml"


0 commentaires

1
votes

Utiliser UltraDit basé sur https://www.ultredit.com/ Forums / Viewtopic.php? F = 52 & T = 6704

Tout ce que j'ai ajouté était une en-tête XML et des bits de pied de page Le premier et le dernier fichier doivent être fixés manuellement (ou retirer l'élément racine de votre source). P>

    // from https://www.ultraedit.com/forums/viewtopic.php?f=52&t=6704 

var FoundsPerFile = 200;      // Global setting for number of found split strings per file.
var SplitString = "</letter>";  // String where to split. The split occurs after next character.
var xmlHead = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
var xmlRootStart = '<letters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" letterCode="OA01" >';
var xmlRootEnd = '</letters>';

/* Find the tab index of the active document */
// Copied from http://www.ultraedit.com/forums/viewtopic.php?t=4571
function getActiveDocumentIndex () {
   var tabindex = -1; /* start value */

   for (var i = 0; i < UltraEdit.document.length; i++)
   {
      if (UltraEdit.activeDocument.path==UltraEdit.document[i].path) {
         tabindex = i;
         break;
      }
   }
   return tabindex;
}

if (UltraEdit.document.length) { // Is any file open?
   // Set working environment required for this job.
   UltraEdit.insertMode();
   UltraEdit.columnModeOff();
   UltraEdit.activeDocument.hexOff();
   UltraEdit.ueReOn();

   // Move cursor to top of active file and run the initial search.
   UltraEdit.activeDocument.top();
   UltraEdit.activeDocument.findReplace.searchDown=true;
   UltraEdit.activeDocument.findReplace.matchCase=true;
   UltraEdit.activeDocument.findReplace.matchWord=false;
   UltraEdit.activeDocument.findReplace.regExp=false;
   // If the string to split is not found in this file, do nothing.
   if (UltraEdit.activeDocument.findReplace.find(SplitString)) {
      // This file is probably the correct file for this script.
      var FileNumber = 1;    // Counts the number of saved files.
      var StringsFound = 1;  // Counts the number of found split strings.
      var NewFileIndex = UltraEdit.document.length;
      /* Get the path of the current file to save the new
         files in the same directory as the current file. */
      var SavePath = "";
      var LastBackSlash = UltraEdit.activeDocument.path.lastIndexOf("\\");
      if (LastBackSlash >= 0) {
         LastBackSlash++;
         SavePath = UltraEdit.activeDocument.path.substring(0,LastBackSlash);
      }
      /* Get active file index in case of more than 1 file is open and the
         current file does not get back the focus after closing the new files. */
      var FileToSplit = getActiveDocumentIndex();
      // Always use clipboard 9 for this script and not the Windows clipboard.
      UltraEdit.selectClipboard(9);
      // Split the file after every x found split strings until source file is empty.
      while (1) {
         while (StringsFound < FoundsPerFile) {
            if (UltraEdit.document[FileToSplit].findReplace.find(SplitString)) StringsFound++;
            else {
               UltraEdit.document[FileToSplit].bottom();
               break;
            }
         }
         // End the selection of the find command.
         UltraEdit.document[FileToSplit].endSelect();
         // Move the cursor right to include the next character and unselect the found string.
         UltraEdit.document[FileToSplit].key("RIGHT ARROW");
         // Select from this cursor position everything to top of the file.
         UltraEdit.document[FileToSplit].selectToTop();
         // Is the file not already empty?
         if (UltraEdit.document[FileToSplit].isSel()) {
            // Cut the selection and paste it into a new file.
            UltraEdit.document[FileToSplit].cut();
            UltraEdit.newFile();
            UltraEdit.document[NewFileIndex].setActive();
            UltraEdit.activeDocument.paste();


            /* Add line termination on the last line and remove automatically added indent
               spaces/tabs if auto-indent is enabled if the last line is not already terminated. */
            if (UltraEdit.activeDocument.isColNumGt(1)) {
               UltraEdit.activeDocument.insertLine();
               if (UltraEdit.activeDocument.isColNumGt(1)) {
                  UltraEdit.activeDocument.deleteToStartOfLine();
               }
            }

            // add headers and footers 

            UltraEdit.activeDocument.top();
            UltraEdit.activeDocument.write(xmlHead);
                        UltraEdit.activeDocument.write(xmlRootStart);
            UltraEdit.activeDocument.bottom();
            UltraEdit.activeDocument.write(xmlRootEnd);
            // Build the file name for this new file.
            var SaveFileName = SavePath + "LETTER";
            if (FileNumber < 10) SaveFileName += "0";
            SaveFileName += String(FileNumber) + ".raw.xml";
            // Save the new file and close it.
            UltraEdit.saveAs(SaveFileName);
            UltraEdit.closeFile(SaveFileName,2);
            FileNumber++;
            StringsFound = 0;
            /* Delete the line termination in the source file
               if last found split string was at end of a line. */
            UltraEdit.document[FileToSplit].endSelect();
            UltraEdit.document[FileToSplit].key("END");
            if (UltraEdit.document[FileToSplit].isColNumGt(1)) {
               UltraEdit.document[FileToSplit].top();
            } else {
               UltraEdit.document[FileToSplit].deleteLine();
            }
         } else break;
            UltraEdit.outputWindow.write("Progress " + SaveFileName);
      }  // Loop executed until source file is empty!

      // Close source file without saving and re-open it.
      var NameOfFileToSplit = UltraEdit.document[FileToSplit].path;
      UltraEdit.closeFile(NameOfFileToSplit,2);
      /* The following code line could be commented if the source
         file is not needed anymore for further actions. */
      UltraEdit.open(NameOfFileToSplit);

      // Free memory and switch back to Windows clipboard.
      UltraEdit.clearClipboard();
      UltraEdit.selectClipboard(0);
   }
}


1 commentaires

Mofi est vraiment un dieu.



3
votes

Comme mentionné déjà le xml_split code> de la perl package XML :: Twig fait un excellent travail.

Utilisation H1>
xml_split < bigFile.xml

#or if compressed e.g.
bzcat bigFile.xml.bz2 | xml_split


0 commentaires