Bonjour,
Je travaille actuellement sur un projet XML->OpenXML (transformation en fichier word) pour la génération d'un catalogue produit à partir d'une base de données.

Les API dont je me sers sont SAXON (pour les tests) et MSXML.NET pour la production.

Tout a très bien fonctionné jusqu'à aujourd'hui. Le volume du catalogue augmentant, je rencontre un nouveau problème. MSXML interrompt brutalement la transformation sans générer d'exception, et le résultat est un XML mal formé (et en fait incomplet). SAXON lui se comporte très bien et continue de me générer le catalogue.

En fouillant sur le net j'ai découvert que MSXML place la sortie de la transformation dans un buffer en mémoire. Dans le cas de mon code ci-dessous c'est dans un stream qui lui-même pointe vers une part du fichier word (la part document.xml).

Il me semble que les modif ne sont écrites sur le disque que lors de l'appel de $streamR.flush().

Comment faire pour qu'il écrive les modif sur le dique au fur eet à mesure de la transformation (en fait comment faire pour que mon stream n'utilise pas de buffer)

PS: je poste dans le forum XML alors que je code en PowerShell avec API .NET mais je me dis que peut être quelqu'un sur ce forum a déjà rencontré ce problème

PPS: à ceux qui vont me proposer d'utiliser saxon dans ma solution de prod, je ne peux pas le faire car saxon en utilisation professionnelle est sous licence

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
 
 #création d'une transformation
  [System.XML.XSL.XSLCompiledTransform]$transform=new-object -TypeName System.XML.XSL.XSLCompiledTransform
    #chargement du fichier de transformation
  $transform.Load($objtransformxsl.fullname)
 
  [system.reflection.assembly]::loadwithpartialname("WindowsBase")
  #obtention d'un pointeur de type package vers le fichier Word modele
  [system.IO.Packaging.Package]$pack=[System.IO.Packaging.Package]::open("$catalogue",[System.IO.Filemode]::Open,[System.IO.FileAccess]::ReadWrite)
 
  #on obtient un pointeur vers le flux de la part /word/document.xml
  [System.IO.Stream]$streamR=$pack.GetPart("/word/document.xml").GetStream([System.IO.FileMode]::Open,[System.IO.FileAccess]::ReadWrite)
  $streamR.setlength(0)
 
 
  #ajout de paramètres à la transformation
  [system.xml.xsl.xsltargumentlist]$xslargs= new-object -TypeName system.xml.xsl.XsltArgumentList
  $xslargs.addparam("avec_prix","",$avec_prix) 
 
 
  $transform.Transform("$formations",$xslargs,$streamR)
 
  $streamR.flush()
  $pack.flush()
  $pack.close() 
  #fermeture des flux
  $streamR.close()