Propriété HasChildNodes

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 9 mai 2006 à 18:55
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 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 ?

Merci d'avance pour votre aide.

Mathmax

3 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 mai 2006 à 21:00
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
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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 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
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 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).

Mathmax
0
Rejoignez-nous