Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1191 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Problème d'écriture XML

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème d'écriture XML

n°1274512
x1800+
Posté le 29-12-2005 à 16:12:40  profilanswer
 

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]  

mood
Publicité
Posté le 29-12-2005 à 16:12:40  profilanswer
 

n°1274544
x1800+
Posté le 29-12-2005 à 17:16:59  profilanswer
 

No ideas ?  [:canaille]

n°1274590
x1800+
Posté le 29-12-2005 à 18:41:08  profilanswer
 

up  [:canaille]  :sweat:

n°1274628
x1800+
Posté le 29-12-2005 à 20:25:25  profilanswer
 

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

n°1274692
x1800+
Posté le 29-12-2005 à 22:34:15  profilanswer
 

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

n°1274928
x1800+
Posté le 30-12-2005 à 12:36:30  profilanswer
 

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

n°1275747
blackgodde​ss
vive le troll !
Posté le 02-01-2006 à 09:47:59  profilanswer
 

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 )-
n°1275780
x1800+
Posté le 02-01-2006 à 11:51:52  profilanswer
 

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
n°1275792
x1800+
Posté le 02-01-2006 à 12:15:01  profilanswer
 

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

n°1275800
x1800+
Posté le 02-01-2006 à 12:35:40  profilanswer
 

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:

mood
Publicité
Posté le 02-01-2006 à 12:35:40  profilanswer
 

n°1276245
ixemul
Nan mais sans blague ! ⚡
Posté le 03-01-2006 à 11:11:39  profilanswer
 

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 ;)

n°1279489
_Mose_
Lonesome coder
Posté le 09-01-2006 à 11:56:50  profilanswer
 

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.
n°1279494
x1800+
Posté le 09-01-2006 à 12:11:11  profilanswer
 

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
n°1279519
_Mose_
Lonesome coder
Posté le 09-01-2006 à 13:01:06  profilanswer
 

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.
n°1279655
x1800+
Posté le 09-01-2006 à 16:00:08  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Problème d'écriture XML

 

Sujets relatifs
probleme avec SmartyPetit probleme php de traitement de chaine (string) assez basic
[C#] Xml Serialisation[swing] Problème avec paintComponent sur un JPanel
probleme aidez moi !!!!!!!!!!!!!!![Résolu] Probleme de mise en page
Problème avec les <Vector> entre Visual Studio 6 et 8.[applet] probleme de mise à jour, modification non prise en compte
probleme flash mx videoprobleme video flash mx
Plus de sujets relatifs à : Problème d'écriture XML


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR