[xml] XML node de type int, boolean ...

Résolu
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006 - 7 mars 2006 à 16:59
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006 - 13 mars 2006 à 11:44
Bonjour je souhaite créeer un noeud XML de type int , ou boolean c possible ?



comme par defaut c'est du string :(

XmlNode nBoolean = xmldoc.CreateNode(XmlNodeType.element, "monBoolean");

elImpByDefault.Value=true;



ya pas une proprieté qui me permet de faire XmlNodeType.int , XmlNodeType.boolean .....



comme çà quand je chope la valeur du noeud je sais que c'est un int ....



Merci pour votre aide
A voir également:

17 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
8 mars 2006 à 09:11
Hello,
ce que tu peux faire, c'est créer un schéma xsd, puis de le passer à xsd.exe (compris avec le SDK), pour te générer une classe.
Tu n'as alors plus qu'à rajouter deux méthodes pour charger, sauver le fichier avec des XmlSerializer, et le tour est joué.
A partir de cette classe, tu peux accéder aux nodes avec leur types.
Depuis que je connais cette technique, je n'utilise plus que ça (ou presque) pour le xml.

Amicalement, SharpMao
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 mars 2006 à 17:13
Il faut sérialiser / désérialiser à partir de la classe représentant la racine de ton XML.

Amicalement, SharpMao
3
titi035 Messages postés 173 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 10 mai 2010
7 mars 2006 à 17:24
Salut,

Quand tu lis ton fichier xml, tu peux essayer les fonctions du style
int.TryParse( elImpByDefault.Value, out MonInt);

A+,
Titi035.
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
7 mars 2006 à 17:40
Donc je suis obligé de laisser les valeur de mes noeud en string et de les convertir a la réception. snifffffff
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
9 mars 2006 à 12:40
tu peux m'expliquer un peu mieu cette technique stp SharpMao ?



J'ai bien créee un schéma xsd creer ma classe en auto avec xsd
comme tu me l'a demandé et maintenant je charge comment mon fichier
pour ajouter des valeur a mes champs ?





Merci d'avance
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
9 mars 2006 à 12:43
En fait le xsd ne sert qu'a valider un fichier XMl si j'ai bien compris
il faut que je créer un fichier XML a part et de le faire verifier par
le xsd ??



ya pas une doc qui explique la technique pas a pas je m'embrouille un peu avec tout ses termes
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 mars 2006 à 12:45
Hello,

Une fois la classe créée, j'ai ajouté deux méthodes, utilisant System.Xml.Serialization.XmlSerializer :

Une static pour charger le fichier,
et une non static pour le sauver.

avec Amicalement, SharpMao
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
10 mars 2006 à 14:50
Merci shrapMao,



j'ai suivi tes conseils et maintenant je sais appliquer un xsd a un
fichier xml donc je peux utiliser n'importe quel type !!!

je serialise le tout avec le XmlSerialiser sauf que j'ai pas fais de methode satic je vais pas tarder a le faire.



J'ai une derniere question :

Je sauvegarde les elements d'une appli dans ce fameux fichier xml typé maintenant
mais lorsque je ferme mon appli je veux pourvoir seulement
modifier les champs ou les propriété que j'ai modifier et pas
serieliser tout mon objet.



Avec cette methode je serialise a chaque fois le tout en écrasant le fichier et recreant mon fichier XML.



ya pas une astuce pour ne changer que les champs que l'on veux dans se fichier sans avoir a l'ecraser totalement ?



ou faut il que j'utilise le xmldocument et que je charge se fichier et que je le modifie.



Merci d'avance
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 mars 2006 à 16:21
Hello,

voivi un exemple pour le static

public class XMLFile{
private string m_sFileName;

public static XMLFile Load(string PsFileName)
{
if(!File.Exists(PsFileName)
{
XMLFile temp = new XMLFile()
temp.m_sFileName= PsFileName;
return temp;
}
else
{
FileStream fs = File.OpenRead(PsFileName);
XmlSerializer ser = New XmlSerializer(GetType(XMLFile));
XMLFile temp = ser.Deserialize(fs);
temp.m_m_sFileName= PsFileName;
fs.Close();
return temp
}
}

// Rest of the class

}

Amicalement, SharpMao
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 mars 2006 à 16:24
Oups,

Excuse.moi, ces derniers temps, je dois faire de VB :-(, et j'ai donc glissé quelques erreurs,
new est en minuscul, bien sur, et il faut mettre tyopeof au lieu de GetType.

Amicalement, SharpMao
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
10 mars 2006 à 16:27
Si tu ne veux pas modifier tous le fichier, il faut utiliser XmlDocument.
Mais ça ne pose en pricipe pas de problèmes de tout recréer, même pour des fichiers volumineux.

Amicalement, SharpMao
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
10 mars 2006 à 17:02
je crois avoir un probleme quand je genere les classe d'un fichier XML existant avec xsd.exe :



j'avais ce type de XML de base



<?xml version="1.0" encoding="utf-8"?>

<localconfig>

<contact>

<screenamecontact realName="toto1">toto</screenamecontact>

<screenamecontact realName="toto2">toto2</screenamecontact>

</contact>

<settings>

<nom>min</nom>

<valide>true</valide>

<experience>0</experience>

</settings>

</localconfig>



je le passe a la moulinette donc j'ai les classe qui son créé :



j'ai une classe localconfig = qui contient des items (je comprends pas trop a quoi ça sert d'ailleurs )

et deux autre classe configSettings et screenamecontact . (pourquoi n'a t'il pas créé de classe contact? )



La j'ai un probleme car lorsque je serialise mes objet mon fichier XML ne ressemble plus a ce que je veux de base.



<?xml version="1.0" encoding="utf-8"?>

<configSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<_nom>toto</_nom>


<_valide>true</_valide>


<_experience>0</_experience>

</configSettings>

<?xml version="1.0" encoding="utf-8"?>

<Screenamecontact xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
_realName="test">test</Screenamecontact>



Donc il me serialize deux fois l'entete du fichier XML et ça plante l'appli



par contre je suis pas sur que je serialize bien car je créé mes objet
xml seperarement sans utiliser la premiere classe qui elle contier les
deux autres classe dans ses items si j'ai bien compris .



Je procede de cette maniere :



configSettings lc = new configSettings ();

lc._nom="toto";

lc._valide=true;

lc._experience=1;



ScreenNames sn = new ScreenNames();

sn._screenamecontact ="test";

sn._Value="test";



et ensuite je serialise ;



XmlSerializer serializer = new XmlSerializer(typeof(configSettings ));

XmlSerializer serializer2 = new XmlSerializer(typeof(Screenamecontact));

TextWriter writer = new StreamWriter(pathfile,false);

serializer.Serialize(writer, ls);

serializer2.Serialize(writer, t);

writer.Close();





Donc mes objets sont serialiser sans etre placer a l'interieur des balise que je voulais a la base



Je fais un erreur ou ???
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
10 mars 2006 à 17:11
merci pour ta classe de serialisation aussi :=) j'avais pas vu lorsque je faisais le precedent post
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
10 mars 2006 à 17:28
je fais comment pour serialiser avec cette classe de base car ce sont des object items



si je fais LocalConfig lc = new LocalConfig() // j'initialise ma classe de base



ensuite je crée mes objets configSettings ()

configSettings cs= new configSettings ();

cs._nom="toto";

cs._valide=true;

cs._experience=1;



ScreenNames sn = new ScreenNames();

sn._screenamecontact ="test";

sn._Value="test";





lc._Items = cs; // en fait c'est
la que j'ai le probleme il me jette violement le compilateur

lc._Items = sn;
// en fait c'est la que j'ai le probleme il me jette
violement le compilateur



XmlSerializer serializer = new XmlSerializer(typeof(LocalConfig));

TextWriter writer = new StreamWriter(pathfile,false);

serializer.Serialize(writer, lc);

writer.Close();



je sens qu'il manque un chouilla et ça sera parfait non ????
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
10 mars 2006 à 18:51
c'est ma premier classe c'est quoi qui fait le lien entre configSettings et Screename?

je vois vraiment pas comment mettre les objets que je creer dans Items pour que ce soit serialisé correctement.





[System.Xml.Serialization.XmlRootAttribute( "localconfig", Namespace="", IsNullable=false)]

public class localconfig {



/// <remarks/>


[System.Xml.Serialization.XmlElementAttribute("settings",
typeof(configSettings),
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]


[System.Xml.Serialization.XmlElementAttribute("contact",
typeof(Screename[]), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]

public object[] _Items {

get { return Items; }

set { Items = value; }

} private object[] Items;

}
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
13 mars 2006 à 11:07
Bonjour,



en fait comme d'habitude c'etait tres simple ça peut servir a quelqu"un il fallait faire :



lc._Items= new object[]{cs};



dans mon cas la serialisation de cette objet ce passe correctement, par
contre j'essaye de serialiser l'autre objet qui est screenName

en faisant
lc._Items= new object[]{sn}; ça ne marche malheureusement j'ai l'exception suivante par le serializer:



_innerException {"Le type Screenamecontact
n'était pas attendu. Utilisez l'attribut XmlInclude ou SoapInclude pour
spécifier les types qui ne sont pas connus statiquement."
} System.Exception



Alors que dans mon xsd le type est bien un string ... la je vois pas le probleme



Si quelqu'un a un idée ça me serait d'une tres grande aide



Encore merci
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
13 mars 2006 à 11:44
.NET trop fort !!!



En cherchant un peu plus j'ai decouvert un peut tard je l'avoue
lorsque je fais un click droit sur un fichier xsd l'option generer le
groupe de donnée. ET ça me crée ma classe tout seul avec les bonne
option !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! plus beoin de script VB pour
automatiser mes propriété .



donc j'ai un objet complet a manipuler !!!



trop fort j'abandonne les xsd.exe et reprend mon projet avec cette methode plus simple !



a ++
0
Rejoignez-nous