[xml] XML node de type int, boolean ... [Résolu]

agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 7 mars 2006 à 16:59 - Dernière réponse : agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention
- 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
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 8 mars 2006 à 09:11
3
Merci
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

Merci SharpMao 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de SharpMao
Meilleure réponse
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 10 mars 2006 à 17:13
3
Merci
Il faut sérialiser / désérialiser à partir de la classe représentant la racine de ton XML.

Amicalement, SharpMao

Merci SharpMao 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de SharpMao
titi035 175 Messages postés vendredi 13 janvier 2006Date d'inscription 10 mai 2010 Dernière intervention - 7 mars 2006 à 17:24
0
Merci
Salut,

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

A+,
Titi035.
Commenter la réponse de titi035
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 7 mars 2006 à 17:40
0
Merci
Donc je suis obligé de laisser les valeur de mes noeud en string et de les convertir a la réception. snifffffff
Commenter la réponse de agarcia_01
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 9 mars 2006 à 12:40
0
Merci
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
Commenter la réponse de agarcia_01
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 9 mars 2006 à 12:43
0
Merci
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
Commenter la réponse de agarcia_01
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 10 mars 2006 à 12:45
0
Merci
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
Commenter la réponse de SharpMao
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 10 mars 2006 à 14:50
0
Merci
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
Commenter la réponse de agarcia_01
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 10 mars 2006 à 16:21
0
Merci
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
Commenter la réponse de SharpMao
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 10 mars 2006 à 16:24
0
Merci
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
Commenter la réponse de SharpMao
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 10 mars 2006 à 16:27
0
Merci
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
Commenter la réponse de SharpMao
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 10 mars 2006 à 17:02
0
Merci
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 ???
Commenter la réponse de agarcia_01
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 10 mars 2006 à 17:11
0
Merci
merci pour ta classe de serialisation aussi :=) j'avais pas vu lorsque je faisais le precedent post
Commenter la réponse de agarcia_01
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 10 mars 2006 à 17:28
0
Merci
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 ????
Commenter la réponse de agarcia_01
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 10 mars 2006 à 18:51
0
Merci
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;

}
Commenter la réponse de agarcia_01
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 13 mars 2006 à 11:07
0
Merci
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
Commenter la réponse de agarcia_01
agarcia_01 51 Messages postés mardi 8 février 2005Date d'inscription 25 août 2006 Dernière intervention - 13 mars 2006 à 11:44
0
Merci
.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 ++
Commenter la réponse de agarcia_01

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.