Page 1 sur 1

Construire un XML ?

Publié : dim. 05/août/2007 10:05
par comtois
Je tente de reproduire cet XML, et je n'arrive pas à reproduire l'identique !

Code : Tout sélectionner

<scene version="1.6">
  <primitives highestID="1">
    <primitive id="1" name="rectangle1" type="rectangle" visible="true" snap="vertex" autoUV="true" groupID="-1">
      <tag>User info</tag>
      <vertices>
        <vertex id="0" x="-384" y="192" z="0" />
        <vertex id="1" x="128" y="192" z="0" />
        <vertex id="2" x="128" y="-320" z="0" />
        <vertex id="3" x="-384" y="-320" z="0" />
      </vertices>
      <polygons>
        <poly mid="0">
          <vertex vid="0" u0="-3" v0="-1.5" />
          <vertex vid="1" u0="1" v0="-1.5" />
          <vertex vid="2" u0="1" v0="2.5" />
          <vertex vid="3" u0="-3" v0="2.5" />
        </poly>
      </polygons>
    </primitive>
  </primitives>
</scene>
Apparemment ça ne merdouille que pour le tag
au lieu de ça
<tag>User info</tag>
j'ai ça
<tag/>
J'ai essayé en mettant

Code : Tout sélectionner

*NodeTag=CreateXMLNode(*NodePrimitive,0,#PB_XML_CData)
Ou
*NodeTag=CreateXMLNode(*NodePrimitive,0,#PB_XML_Comment)
Mais ça ne donne rien :?

Deuxième question, quand j'exporte le XML, PB ajoute un entête
<?xml version="1.0" encoding="UTF-8"?>
Je comprends que ça peut être important (pour distinguer de l'unicode), mais dans mon cas je n'en ai pas besoin, donc je bricole en jouant sur l'adresse Peeks(*Mem+38 ) pour afficher le résultat, mais il n'y a pas une solution plus propre d'enlever cet entête ?


Et voici le code pour tester

Code : Tout sélectionner

;-Création XML
CreateXML(0)

*NodeMain=CreateXMLNode(RootXMLNode(0))
SetXMLNodeName(*NodeMain, "scene")
SetXMLAttribute(*NodeMain, "version", "1.6")

*NodePrimitives=CreateXMLNode(*NodeMain)
SetXMLNodeName(*NodePrimitives, "primitives")
SetXMLAttribute(*NodePrimitives, "highestID", "1")


*NodePrimitive=CreateXMLNode(*NodePrimitives)
SetXMLNodeName(*NodePrimitive, "primitive")
For i = 1 To 7
  Read Attribute.s
  Read Value.s
  SetXMLAttribute(*NodePrimitive, Attribute, Value)
Next i

*NodeTag=CreateXMLNode(*NodePrimitive)
SetXMLNodeName(*NodeTag, "tag")

*NodeVertices=CreateXMLNode(*NodePrimitive)
SetXMLNodeName(*NodeVertices, "vertices")

*NodePolygones=CreateXMLNode(*NodePrimitive)
SetXMLNodeName(*NodePolygones, "polygons")


For i=0 To 3
  *NodeVertex=CreateXMLNode(*NodeVertices)
  SetXMLNodeName(*NodeVertex, "vertex")
  SetXMLAttribute(*NodeVertex, "id", Str(i))
  Read x.s
  Read y.s
  Read z.s
  
  SetXMLAttribute(*NodeVertex, "x", x)
  SetXMLAttribute(*NodeVertex, "y", y)
  SetXMLAttribute(*NodeVertex, "z", z)
Next i

*NodePoly=CreateXMLNode(*NodePolygones)
SetXMLNodeName(*NodePoly, "poly")
SetXMLAttribute(*NodePoly, "mid", "0")

For i=0 To 3
  *NodeVertex=CreateXMLNode(*NodePoly)
  SetXMLNodeName(*NodeVertex, "vertex")
  SetXMLAttribute(*NodeVertex, "vid", Str(i))
  Read u0.s
  Read v0.s
  SetXMLAttribute(*NodeVertex, "u0", u0)
  SetXMLAttribute(*NodeVertex, "v0", v0)
Next i

;-XML --> Texte
*Mem=AllocateMemory(ExportXMLSize(0))
FormatXML(0,#PB_XML_CutSpace)
ExportXML(0,*Mem,ExportXMLSize(0))

;I dont need <?xml version="1.0" encoding="UTF-8"?> 
Debug PeekS(*Mem+38) ;<<< Is there another way ? 

DataSection
Data.s "id","1"
Data.s "name","rectangle1"
Data.s "type","rectangle"
Data.s "visible","true"
Data.s "snap","vertex"
Data.s "autoUV","true"
Data.s "groupID","-1"

Data.s "-384", "192","0"
Data.s  "128", "192","0"
Data.s  "128","-320","0"
Data.s "-384","-320","0"

Data.s "-3", "-1.5"
Data.s "1", "-1.5"
Data.s "1", "2.5"
Data.s "-3", "2.5"
EndDataSection 

Publié : dim. 05/août/2007 10:28
par Ollivier
Ton code crash. Je n'envoie pas le rapport d'erreur à Microsoft.

Publié : dim. 05/août/2007 10:30
par comtois
Tu utilises la version 4.10 beta 2 ?

Publié : dim. 05/août/2007 10:59
par comtois
Je pensais que j'avais testé toutes les possibilités, mais je viens de m'apercevoir qu'il restait encore celle ci
SetXMLNodeText(*NodeTag, "User info")
et c'est la bonne !! ça marche !!

Par contre si quelqu'un sait comment supprimer proprement l'entête ajouté par PB quand on exporte, je suis preneur.

Publié : dim. 05/août/2007 13:51
par Guimauve
comtois a écrit :Je pensais que j'avais testé toutes les possibilités, mais je viens de m'apercevoir qu'il restait encore celle ci
SetXMLNodeText(*NodeTag, "User info")
et c'est la bonne !! ça marche !!

Par contre si quelqu'un sait comment supprimer proprement l'entête ajouté par PB quand on exporte, je suis preneur.
C'est peut être un petit bogue ...

Si PB ajoute un entête, c'est probablement pour une bonne raison. À mon avis le fait qu'il y est un entête ne deverait pas changer l'utilisation du fichier.

Faut dire je commence à peine à tester les commandes XML.

A+
Guimauve

Publié : dim. 05/août/2007 18:50
par comtois
Oui , PB ajoute la déclaration et c'est important qu'elle y soit, en fait c'est Deled qui ne la gère pas, et pire génère une erreur !!
---------------------------
Error
---------------------------
CallBackProc: TPluginManager.SetData: Unexpected character '?' in input (...<?xml vers), position (1,3).
---------------------------
OK
---------------------------
Bon son auteur vient de me répondre, il va songer à l'utiliser. ça reste vague, c'est surement pas sa priorité :?

Bref en enlevant cette déclaration , j'arrive à importer ma scène dans Deled.

Publié : lun. 06/août/2007 13:37
par Guimauve
Donc la seule astuce que je vois serais de modifier le xml en mode texte.
Un petit programme qui charge le xml et qui le ré-écrit en sans l'entête.

S'il y a plusieurs fichiers bien sûr. Si non, le bon vieux Bloc-Note fait
l'affaire, mais je suis d'accord pour dire que ça fait un opération de plus.
Et Deled devrait être en mesure de gérer ce standard.

A+
Guimauve

Publié : lun. 06/août/2007 21:37
par comtois
Guimauve a écrit :Donc la seule astuce que je vois serais de modifier le xml en mode texte.
oui c'est fait dans le programme déjà

Code : Tout sélectionner

;-XML --> Texte
*Mem=AllocateMemory(ExportXMLSize(0))
FormatXML(0,#PB_XML_CutSpace)
ExportXML(0,*Mem,ExportXMLSize(0)) 
Et ensuite je supprime les 38 premiers caractères en attendant que l'auteur de Deled prenne en charge la déclaration XML :)