XML - Format des balises

Résolu
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 2 avril 2013 à 20:10
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 - 3 avril 2013 à 14:45
Bonjour à tou(te)s

Je fais mes premiers pas sérieux en .Net et en XML.
J'utilise un XmlWriter du System.XML pour fabriquer un fichier du même métal.

Lorsqu'un élément est vide, le format généré est du genre :
    <default_param1 />
Est-il possible de lui imposer le format suivant :
    <default_param1></default_param1>
(par une option du Settings, quelque part ?)

Ce n'est pas que ça me gène vraiment puisque le format abrégé respecte la norme, mais, pour faire mes essais, j'ai un fichier XML de référence qui utilise cette seconde (et peut-être ancienne) syntaxe et pour faire mes vérifications, j'utilise un logiciel de comparaison qui 'sonne' à chacune de ces lignes.
(le fichier généré fait environ 60 Mo, d'où l'intérêt de ce comparateur)

Est-ce une histoire d'ancienne/nouvelle norme ?
Donc de version ?
Mais de version de quoi ... ?
Comme je l'ai dit, je débute en .Net et rien que pour trouver quelle version de framework j'utilise, j'ai passé une plombe !

.Net c'est très bien, mais faut avoir du temps ...
Pour la petite histoire, j'ai refermé par inadvertance la "fenêtre d'exécution" : Et bah pas moyen de trouver le menu qui permettrait de la faire réapparaitre. Encore une heure de perdue ... et obligé de me passer de cette fenêtre.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)

11 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
3 avril 2013 à 13:58
Bonjour à tous,

Avec ceci ?
Attention, il faut ouvrir le fichier XML résultat avec le bloc note ou wordpad et pas avec IE car IE réinterprète les balise vide.

'Paramètres du Writer XML
Dim settings As New XmlWriterSettings()
settings.Indent = True
settings.OmitXmlDeclaration = True

'Création du Writer
Dim writer As XmlWriter = XmlWriter.Create("C:\Test.xml", settings)

'Ouverture du noeud racine
writer.WriteStartElement("Personnes")

'Nouveau noeud
writer.WriteStartElement("Personne")

'Création d'un élément vide
writer.WriteStartElement("Nom")
writer.WriteString("")
writer.WriteFullEndElement()

'Fermeture du noed
writer.WriteFullEndElement()

'Fermeture du noeud racine
writer.WriteFullEndElement()
writer.Close()
3
Utilisateur anonyme
2 avril 2013 à 21:09
Bonsoir jack,

Est-il possible de lui imposer le format suivant

Jette un coup d'oeil ici.

Et pour la fenêtre d'exécution tu peux frapper Ctrl+G ou cliquer sur l'icône 'immédiat' du menu (celle où figure un petit point d'exclamation rouge).
0
Utilisateur anonyme
2 avril 2013 à 21:46
Bonjour,

Pour ta question, je vais te revenir un peu plus tard, parce que dois faire certaines recherches. En fait, il y a une classe dont j'ai oublié le nom qui a (c'est de mémoire, donc pitié si je me trompe) une méthode WriteOpenElement et une méthode WriteCloseElement. Je ne sais pas si elle colle les deux balises sur la même ligne quand on ne met rien d'autre entre les deux.

-------

Pour ta fenêtre "Immédiate", je l'ai retrouvée en cherchant dans mes barres d'outils (que j'ai personnalisées), donc sans garantie que tu l'as chez-vous.

Tu cliques sur la petite flèche immédiatement à droite du dernier bouton de la barre d'outils "Déboguer", (Pas la flèche des personnalisation, plutôt le petit triangle "vers le bas" juste avant.) et ensuite, il y a un sous-menu Fenêtres qui devrait mener à la bonne place.

Mais, j'ai aussi trouvé un raccourci-clavier qui fonctionne chez-moi.

En 3 étapes
1 - Ctrl + D (simultané)
2 - tu lâches tout
3 - I
0
Utilisateur anonyme
2 avril 2013 à 21:58
Bonjour,

Encore une fois j'ai commencé ma réponse avant de voir celle de Banana32. C'est en train de devenir une habitude.

Avec VB 2012 Express le raccourci-clavier Ctrl-G n'ouvre pas la fenêtre immédiate, mais la recherche de la Xième ligne de la fenêtre active. Autre différence, le mode pas à pas c'est F10 en VB2012 au lieu de F8.

Morale de l'histoire; il faut maintenant faire attention aux versions dès que l'on se met à parler du clavier.
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 avril 2013 à 02:03
Lol, oui, trop de choses qui changent finissent par agacer (*).

Oui, le XmlWrite a ces méthodes WriteOpenElement et Close, ce sont celles que j'utilise. Elles ont l'avantage de contrôler la compatibilité Xml au fur et à mesure.
Et donc, quand on utilise ces méthodes alors qu'une 'Value' vide est écrite, le balisage se contente de fermer la balise d'ouverture - chose qu'on retrouve en html.
C'est sûr, avec le nombre, ça permet d'avoir des fichiers moins gros.

@Banana : Bien vu !
J'ai même réussi à le faire marcher ! lol
Mais, (jamais content) le format 'long' que permet ce paramètre 'IsEmpty' à False affiche la balise ouvrant et fermant sur deux lignes distinctes. J'aurais zaimé qu'elles fussent placées linéairement. (vache, y avait longtemps que je l'avais pas placée, celle là !)
Fait suer.
Remarque, c'est presque pas normal puisqu'un élément peut accueillir du texte et dans ce cas, à la relecture, on pourrait laisser penser que cet élément contient juste un retour chariot, alors qu'il est vide.
Bizarre.

Pour ma part, ce n'est pas vital, c'est juste pour ma phase de contrôle/comparaison avec l'original que cela me perturbe.

Sinon, il va me falloir créer un programme de test lisant chaque fichier (généré ici et l'original) et comparant les items lus en synchrone.
Tout est imaginable.

Merci pour vos idées.

(*) pour la petite histoire et vu que vous avez le temps (sic), j'ai eu un abondant recours à la fonction Split qui est vraiment top en .Net, permettant de faire la césure sur de multiples Char ou String.
Par contre, quand j'ai voulu faire un Split avec un simple texte unique, ça m'a pris 15 min pour comprendre pourquoi ça ne voulait pas de mes paramètres.
L'avènement des accolades { et } m'était encore étranger.
0
Utilisateur anonyme
3 avril 2013 à 02:33
Bonjour,

Pour ta question, je vais te revenir un peu plus tard, parce que dois faire certaines recherches. En fait, il y a une classe dont j'ai oublié le nom qui a (c'est de mémoire, donc pitié si je me trompe) une méthode et une méthode WriteCloseElement. Je ne sais pas si elle colle les deux balises sur la même ligne quand on ne met rien d'autre entre les deux.



Oups !!!! Encore une fois, honte à moi. Ce n'est pas WriteOpenElement, mais WriteStartElement et, évidemment, ce n'est pas WriteCloseElement, mais WriteEndElement. Je ne sais pas si c'est la même chose dans les versions précédentes, mais avec VS2012, il y a aussi des méthodes équivalentes pour effectuer les opérations de manière asynchrone. Ces méthodes se trouvent dans la classe XmlTextWriter. Cette classe permet d'écrire, sans trop se casser la tête des fichiers XML conformes à la norme 1.0. Mais dans l'aide, ils semblent préconiser la classe XMLWriter à partir de la version 2 du Framework.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 avril 2013 à 04:02
En effet, Start et End (on n'est plus à ça prêt).
XmlTextWriter : Oui, j'ai vu ça dans l'aide par rapport au XmlWriter préconisé et vers lequel je me suis orienté. (tant qu'à faire, autant faire les choses correctement).

En plus, c'est vrai que c'est assez simple à manipuler et j'y vois de gros intérêts :
- La syntaxe est vérifiée au fur et à mesure.
Bon, l'inconvénient, c'est que dès que ça coince, l'objet est fermé/perdu.
- Il s'occupe lui même des indentations (que l'on peut définir comme on le veut)
- Il s'occupe seul d'ajouter les guillemets obligatoires dans les valeurs des attributs (alors qu'ils sont bannis des valeurs des éléments - allez comprendre leur logique)

J'ai pas encore installé VS 2012 et suis en 2010, mais bon, ce n'est qu'un IDE et les méthodes des objets/classes ne changent qu'au gré des versions de FrameWork; presque indépendant de l'IDE.
0
Utilisateur anonyme
3 avril 2013 à 13:18
J'aurais zaimé qu'elles fussent placées linéairement. (vache, y avait longtemps que je l'avais pas placée, celle là !)

Je pense que tu parles des WhiteSpaces. Seulement, je n'ai pas trop compris moi-même leur fonctionnement. Voir ici.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 avril 2013 à 14:14
Merci Foliv

En effet, ça fonctionne comme je le souhaite.
J'étais pourtant sûr d'avoir tout essayé.

Au passage, c'est assez bizarre puisque WriteFullEndElement est sensé générer une balise de fin complète (ce que je souhaite) alors que, dans ton exemple modifié, WriteEndElement fait exactement la même chose.
Bizarreries ...

Ah si, c'est dû au fait que tu fasses un WriteString (ou WriteValue) entre deux.
S'il n'y a pas de WriteString, WriteFullEndElement fabrique une balise complète à l'instar de WriteEndElement qui fabrique un simple />

Merci beaucoup
You'r the best !
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 avril 2013 à 14:25
Juste pour info, j'ai encore des /> mais c'est dû au fait que j'utilise WriteElementString.
En décomposant WriteStartElement + WriteString + WriteFullEndElement, le format souhaité est correct.
Cool.

Encore merci à tous.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
3 avril 2013 à 14:45
Effectivement "WriteElementString" ne fait qu'un "WriteEndElement"

Ci dessous sa structure :
Public Sub WriteElementString(ByVal localName As String, ByVal ns As String, ByVal value As String)
    Me.WriteStartElement(localName, ns)
    If ((Not value Is Nothing) AndAlso (value.Length <> 0)) Then
        Me.WriteString(value)
    End If
    Me.WriteEndElement
End Sub

0
Rejoignez-nous