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. P>
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. P>
Avant de commencer à écrire un code personnalisé .NET pour le faire; (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é.) p>
7 Réponses :
Il n'y a rien de construit qui peut gérer cette situation facilement. P>
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". P>
mise à jour: p>
Après un morceau de creuser, j'ai trouvé Cet article décrit un façon de diviser des fichiers à l'aide de XSLT. p>
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: p> Vous pouvez émettre une copie du fichier contenant uniquement des éléments code> de données code> dans une certaine plage avec ce XSLT: < / p> (note, à la manière dont cela est basé sur la transformation d'identité, cela fonctionne même si Vous devez toujours compter les éléments CODE> DATA CODE> ÉLÉMENTS DANS LA SOURCE XML et exécutez la transformée à plusieurs reprises avec les valeurs de en-tête code> n'est pas le niveau supérieur ELEMENT.) P> $ STARTPOSITION CODE> et < code> $ endposition code> qui convient à la situation. p> p>
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.
"Y a-t-il un outil de ligne de commande standard qui fonctionnera sous Windows qui le fait?" P>
xml_split - divisez d'énormes documents XML en petits morceaux p>
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é. P> Il existe un code de script sur cette page (Démarre avec modifie les champs gras marqués (ou ** ** ** marqués) pour vos besoins. (Ceci est également exprimé à la page vidéo) p> 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. P> Remarque:
Le nom du fichier d'entrée peut être Split () code>) 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: p> "c: \\ utilisateurs \\ auser \\ bureau \\ auser \\ auser \\ auser \\ a_xml_file.xml" code> (Double tabas)
et fichier de sortie "c: \\ utilisateurs \\ auser \\ bureau \\ anoutputfolder \\ pièce" + nfilecount + ".xml" code> p> p> p> p> p> p> P> P>
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);
}
}
Mofi est vraiment un dieu.
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
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).