Propriété HasChildNodes [Résolu]

Signaler
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008
-
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 ?

Merci d'avance pour votre aide.

Mathmax

3 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Dans ton cas, tu sélectionnes un élément qui n’a pas d’autre é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)
{

// return false
}


<HR>

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319 /auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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 j’ai 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 :


XmlNode xmlNodeFirst = doc.FirstChild


Console.WriteLine("Résultat:" + xmlNodeFirst.Name);


Console.WriteLine("Résultat:" + xmlNodeFirst.InnerText);


XmlNode nextNode = xmlNodeFirst.FirstChild; Console.WriteLine("Résultat:" + nextNode.InnerText);



Résultat auquel on pouvait s’attendre :

> Résultat:book


> Résultat:Pride And Prejudice19.95


> Résultat:Pride And Prejudice

Maintenant, on change le code d’avant et on met ceci :

XmlNode xmlNodeFirst = doc.FirstChild.Attributes[0];


Console.WriteLine("Résultat:" + xmlNodeFirst.Name);


Console.WriteLine("Résultat:" + xmlNodeFirst.InnerText);


XmlNode nextNode = xmlNodeFirst.FirstChild;


Console.WriteLine("Résultat:" + nextNode.InnerText);

Résultat :

> Résultat:ISBN


> Résultat:1-861001-57-5

> Résultat:1-861001-57-5

Explication :

Dans le premier exemple, on sélectionne un Element (qui possède d’autre élément). FirstChild passe donc à l’élément suivant et la property HasChildNode retourne true. Logiquement, le nom du nœud courant est book, le text du nœud suivant Pride And Prejudice.
Dans l’autre cas, on sélectionne un attribut, et alors tout est différent. Le nom de l’attribut est ISBN (logique) et son text est 1-861001-57-5 (logique aussi). La property HasChildNode retourne à nouveau true mais ce n’est pas le prochain élément qui est pris, mais le text. Le text du nœud suivant est à nouveau 1-861001-57-5 et son nom est #text.
On constate donc que tout dépend ce qu’on sélectionne, et tout dépend le context, on a des réactions différentes pour ces fonctions.


<HR>

[Pub] =13319 http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319 /auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
Messages postés
403
Date d'inscription
vendredi 28 octobre 2005
Statut
Membre
Dernière intervention
31 août 2008

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).

Mathmax