Problème d'écriture XML

Problème d'écriture XML - C#/.NET managed - Programmation

Marsh Posté le 29-12-2005 à 16:12:40    

Bonjour à tous,
 
Voila, j'ai un petit problème au niveau de l'écriture d'un fichier xml. :)  
 
Le soucis
Je récupère les données contenues dans un fichier .X(format des meshes 3D de directX), et je parse toutes les données avec les XFileData et autres objets MDX, pour ensuite les réécrire dans un fichier XML personnalisé.  
 
Le fichier XML est censé se présenter comme suis :

Code :
  1. <feobject>
  2.     <frames>
  3.          <mesh>
  4.              ....
  5.          <material id="" texture="" >


Je procède donc via des XPathNavigator pour naviguer dans les branches du XML généré. L'écriture de toutes les branches marche, sauf une : celle nommée "material", et plus particulièrement pour l'écriture de l'attribut texture. :sweat:  
L'erreur que l'appli me retourne est la suivante : "'.', hexadecimal value 0x00, is an invalid character." (argumentException). :cry:  
 
Le code du parser :

Code :
  1. ...
  2.                                 XFileData materialTexture = currentMaterial.GetChild(0);
  3.                                 if (materialTexture.Type == XFileGuid.TextureFilename)
  4.                                 {
  5.                                     GraphicsStream TextureGS = materialTexture.Lock();
  6.                                     byte[] bBuffer = new byte[TextureGS.Length];
  7.                                     TextureGS.Read(bBuffer, 0, (int)TextureGS.Length);
  8.                                        
  9.                                     string sTextureFileName = Encoding.UTF8.GetString(bBuffer); 
  10.                                     materialTexture.Unlock();
  11.                                     mNewMat.TextureFile = sTextureFileName;
  12.                                 }
  13. ...


 
Le code d'écriture du XML

Code :
  1. ...
  2.                     xMaterialListNavigator.AppendChildElement("", "material", "", null);
  3.                     XPathNavigator xMaterialNavigator =
  4.                         xMaterialListNavigator.SelectSingleNode("material[last()]" );
  5.                  
  6.                     xMaterialNavigator.CreateAttribute("", "ID", "", currentMaterial.ID.ToString());
  7.                     xMaterialNavigator.CreateAttribute("", "texture", "", currentMaterial.TextureFile);
  8.                     xMaterialNavigator.AppendChildElement("", "diffuse", "", null);
  9. ...


Sachant que l'objet currentMaterial correspond a une classe personnalisée, et donc que l'objet TextureFile est un string (du genre "latexture.jpg" tout simplement).
 

  • J'ai tenté d'insérer ce string en node enfant (AppendChildElement), mais même erreur.
  • J'ai également tenté des convertions en autre formats d'encoding (UTF8,ASCII,UNICODE...), mais rien n'y fait (peut-être que je m'y prend mal sur ce point aussi... :sweat: )
  • Même en remplacant le '.' du string par un autre char (exemple un '_', ce qui donne "latexture_jpg" ), j'ai toujours la même erreur retournée  :(  


Donc si quelqu'un a une idée, une suggestion pour régler ce soucis, je suis preneur  [:canaille]  
 
Merci d'avance  [:pingouino]  

Reply

Marsh Posté le 29-12-2005 à 16:12:40   

Reply

Marsh Posté le 29-12-2005 à 17:16:59    

No ideas ?  [:canaille]

Reply

Marsh Posté le 29-12-2005 à 18:41:08    

up  [:canaille]  :sweat:

Reply

Marsh Posté le 29-12-2005 à 20:25:25    

C'est dingue l'activité de la cat C#/Managed par les temps qui courent  :o

Reply

Marsh Posté le 29-12-2005 à 22:34:15    

Je continue de faire mes essais mais toujours rien  [:pingouino]  
Toujours personne qui peut m'aider?  :(

Reply

Marsh Posté le 30-12-2005 à 12:36:30    

Re-Up de fin d'année  :o

Reply

Marsh Posté le 02-01-2006 à 09:47:59    

byte[] bBuffer = new byte[TextureGS.Length];
TextureGS.Read(bBuffer, 0, (int)TextureGS.Length);                                                                      string sTextureFileName = Encoding.UTF8.GetString(bBuffer);
 
ca marche tout ca si TextureGS.Length = 0 ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 02-01-2006 à 11:51:52    

Non ca marche pas si c'est = 0 :whistle: Merci de m'avoir montré ca  :)  
J'ai rajouté une verif (toute bete, un if  [:canaille] )
 
Mais ca résouds pas le problème, toujours cette erreur de char invalide  :(
 
 
EDIT : d'ailleurs je sais pourquoi j'avais pas mis de if au départ :
Dans le formatX, c'est soit y a un node TextureFileName qui  contient le string, soit y a pas de TextureFileName. Donc normalement peut pas y avoir de TextureFileName avec un string vide :)
 
Mais on sais jamais, autant checker


Message édité par x1800+ le 02-01-2006 à 12:01:17
Reply

Marsh Posté le 02-01-2006 à 12:15:01    

Y a du neuf, jviens de me rendre compte de quelquechose  :heink:  
 
J'ai pris un objet en .X, mis en TextureFileName la chaine "DADA". Mon programme la retrouve bien, mais m'indique que le string a une longueur de 5  :heink:  
J'ai mis une chaine vide pour tester, il me dit que ca fait 1 char de long  :heink:  
 
Donc je me demande si y aurait pas un char bizarre (impossible a écrire ou autre  [:pingouino] ) qui serait lu  [:pingouino]  
 
Mais si c'est le cas, comment le virer? J'ai tenté d'utiliser des string.Normalize(), string.Trim(), mais ca change rien  :sweat:  
 
 
Donc si quelqu'un a une idée...
 
 
Merci

Reply

Marsh Posté le 02-01-2006 à 12:35:40    

Bon ben j'ai résolu le problème, avec une methode bien degueu   [:canaille]  
 
 

Code :
  1. if (TextureGS.Length > 0)
  2.                                     {
  3.                                         string sTextureFileName = TextureGS.Read(false);
  4.                                         char[] cTextureChars = new char[sTextureFileName.Length - 1];
  5.                                         sTextureFileName.CopyTo
  6.                                             (0, cTextureChars, 0, sTextureFileName.Length - 1);
  7.                                         string sFinal = null;
  8.                                         for (int b = 0; b < cTextureChars.Length; b++)
  9.                                             sFinal += cTextureChars[b];
  10.                                         mNewMat.TextureFile = sFinal;


 
Ca marche bien, plus d'erreur....Maintenant faut voir si ca marche dans tous les cas ;|
 
Merci a ceux qui ont lu / posté  :hello:

Reply

Marsh Posté le 02-01-2006 à 12:35:40   

Reply

Marsh Posté le 03-01-2006 à 11:11:39    

x1800+ a écrit :

Y a du neuf, jviens de me rendre compte de quelquechose  :heink:  
 
J'ai pris un objet en .X, mis en TextureFileName la chaine "DADA". Mon programme la retrouve bien, mais m'indique que le string a une longueur de 5  :heink:  
J'ai mis une chaine vide pour tester, il me dit que ca fait 1 char de long  :heink:  
 
Donc je me demande si y aurait pas un char bizarre (impossible a écrire ou autre  [:pingouino] ) qui serait lu  [:pingouino]  
 
Mais si c'est le cas, comment le virer? J'ai tenté d'utiliser des string.Normalize(), string.Trim(), mais ca change rien  :sweat:  
 
 
Donc si quelqu'un a une idée...
 
 
Merci


 
l'idee, c'est que ce caractere supplementaire est le caractere de fin de chaine, un grand classique en manipulation de tableaux de char <-> string ;)

Reply

Marsh Posté le 09-01-2006 à 11:56:50    

Question : ton fichier c'est du XML ? Pourquoi tu utilises des fonctions le lecture bas niveau au lieu des fonctions de lecture XML du framework ?
Genre les XmlDocument, XmlElement et XmlAttributes ?
Si t'as jamais utilisé ces trucs là : tu veux un sample ?  A mon humble avis c'est plus propre, et ton bug n'apparaitrai pas.


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 09-01-2006 à 12:11:11    

Je dis pas non pour des samples :) Bien que je vais quand même chercher de la doc sur msdn et le reste :)
Le fichier d'origine c'est un .X qui n'a rien a voir avec le xml, le fichier que j'ecris par contre c'est bien du xml.
 
Si j'utilise les classes XPathNavigator etc. c'est parceque ca me semblait plus "intuitif" aux premiers abords (avec notamment les selections du style machin[last()] etc.) :)
 
EDIT : Je me suis déja servi quand même des XmlDocument, XmlNode :) Mais je maitrise pas des masses la navigation entre les noeuds (pour choisir le bon etc en fait)  :o


Message édité par x1800+ le 09-01-2006 à 12:12:20
Reply

Marsh Posté le 09-01-2006 à 13:01:06    

Ah oki, je viens de relire, c'est moi qui ai rien capté :)
 
Bon je te file deux pti samples quand même, pour lire et écrire ton fichier.
Ils sont hyper basiques, je sais pas si c'est ce que tu cherches.

Code :
  1. // LIRE
  2. // XmlDocument de travail
  3. XmlDocument doc = new XmlDocument();
  4. // on le charge
  5. doc.Load(filename);
  6. // aller chercher le node "material"
  7. XmlNode material = doc["feobject"]["frames"]["material"];
  8. // lire les données
  9. int id = material.Attributes["id"].Value;
  10. string texture = material.Attributes["texture"].Value;
Code :
  1. // ECRIRE
  2. // XmlDocument de travail
  3. XmlDocument doc = new XmlDocument();
  4. // on y ajoute "feobject"
  5. XmlElement foeobject = doc.CreateElement("feobject" );
  6. doc.AppendChild(foeobject);
  7. // on y ajoute "frames"
  8. XmlElement frames = doc.CreateElement("frames" );
  9. foeobject.AppendChild(frames);
  10. // on y ajoute le material
  11. XmlElement material = doc.CreateElement("TextMethod" );
  12. // id
  13. XmlAttribute id = doc.CreateAttribute("id" );
  14. id.Value = ...;
  15. material.Attributes.Append(id);
  16. // texture
  17. XmlAttribute texture = doc.CreateAttribute("texture" );
  18. texture.Value = ...;
  19. material.Attributes.Append(texture);
  20. frames.AppendChild(material);


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 09-01-2006 à 16:00:08    

Ca pourra m'être utile en tout cas :) Merci beaucoup :)
Même si ca reviens grosso modo au même qu'avec les XPath et cie., ca serait peut etre plus clean dans mon code, donc c'est bon a prendre  :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed