cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008
-
9 mai 2006 à 18:55
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008
-
9 mai 2006 à 23:20
Bonjour,
J'ai un problème avec la propriété HasChildNodes de la classe XmlNode
J'ai un xml comme ceci :
texte à l'intérieur
Si j'écris le bout de programme suivant :
string MyXml = " texte à l'intérieur ";
XmlDocument doc = new XmlDocument();
doc.LoadXml(MyXml);
XmlNode MyNode = doc.SelectSingleNode("balise");
Console.Write(MyNode.HasChildNodes.ToString());
alors j'obtiens la valeur True. Le propriété HasChildNodes considère donc le texte "texte à l'intérieur" comme étant un noeud enfant. Vous trouvez ça normal vu que le texte n'est pas du type XmlNode ? Dans tous les cas, j'aimerais savoir comment faire pour qu'elle ne considère pas le texte comme étant un noeud enfant ? Faut-il que j'utilise une autre propriétée ?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 9 mai 2006 à 21:00
Dans ton cas, tu sélectionnes un élément qui na pas dautre élément. HasChildNode retourne true et le prochain élément est le text, avec comme name #text.
Pour répondre à la question que tu poses, tu peux faire comme ceci (pas forcément très élégant) :
string myXml =
" texte à l'intérieur ";
XmlDocument doc =
new
XmlDocument();
doc.LoadXml(myXml);
XmlNode myNode = doc.SelectSingleNode(
"balise");
if (myNode.HasChildNodes && myNode.NodeType !=
XmlNodeType.Element)
{
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 9 mai 2006 à 20:56
Salut,
La question est intéressante, et à vrai dire je ne connaissais pas la réponse avant que je cherche pourquoi on avait ce comportement. Voici la réponse (dumoins, ce que jai pu en conclure).
Prenons un petit exemple pour comprendre :
XmlDocument doc new XmlDocument();<?xml:namespace prefix o ns = "urn:schemas-microsoft-com:office:office" />
doc.LoadXml("" +
"<title>Pride And Prejudice</title>" +
"19.95
" +
"");
Dans un premier temps, on va lire le premier Node du document en appelant la property FirstChild :
Dans le premier exemple, on sélectionne un Element (qui possède dautre élément). FirstChild passe donc à lélément suivant et la property HasChildNode retourne true. Logiquement, le nom du nud courant est book, le text du nud suivant Pride And Prejudice.
Dans lautre cas, on sélectionne un attribut, et alors tout est différent. Le nom de lattribut est ISBN (logique) et son text est 1-861001-57-5 (logique aussi). La property HasChildNode retourne à nouveau true mais ce nest pas le prochain élément qui est pris, mais le text. Le text du nud suivant est à nouveau 1-861001-57-5 et son nom est #text.
On constate donc que tout dépend ce quon sélectionne, et tout dépend le context, on a des réactions différentes pour ces fonctions.
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008 9 mai 2006 à 23:20
Merci beucoup pour ta réponse très complète.
Ca marche avec te méthode mais j'ai mis :
if (myNode.HasChildNodes && myNode.FirstChild.NodeType !=
XmlNodeType.Element)
au lieu de
if (myNode.HasChildNodes && myNode.NodeType !=
XmlNodeType.Element)
C'est en effet le texte qui est à l'intérieur (considéré comme fils) qui n'est pas un élément XML et non la balise elle même.
Je trouve quand même cette propriété HasChildNodes assez étrange. D'abord elle ne porte pas bien son nom. Elle devrait plutôt s'appeler HasContent puisqu'elle détermine seulement si une balise a du contenu et non pas si elle contient ou non des noeuds XML. D'autre part son fonctionnement est bizzare puisqu'on a rarement à séléctionner des balises qui n'ont pas de contenu dans un document XML, ces dernières n'ayant pas lieu d'exister (à l'exéption des balises ne contenant que des attributs).