Question

quelles sont les différences principales entre SelectNodes et GetElementsByTagName.

Était-ce utile?

La solution

SelectNodes est un .NET / procédé spécifique à MSXML qui reçoit une liste de noeuds correspondant à un l'expression de XPath. XPath peuvent sélectionner des éléments par nom de la balise, mais peut aussi faire beaucoup d'autres, les règles de sélection plus complexes.

getElementByTagName est un niveau DOM 1 de base Méthode standard disponible dans de nombreuses langues (mais écrit avec un G de capital dans .NET). Il sélectionne uniquement des éléments par nom de balise; vous ne pouvez pas demander de sélectionner des éléments avec un attribut, ou d'éléments avec le nom de l'étiquette a l'intérieur d'autres éléments avec le nom de l'étiquette b ou quoi que ce soit intelligent comme ça. Il est plus vieux, plus simple et plus rapide dans certains environnements.

Autres conseils

SelectNodes prend une XPath expression en tant que paramètre et renvoie tous les noeuds qui correspondent à cette expression.

GetElementsByTagName prend un nom de balise en tant que paramètre et renvoie toutes les balises qui ont ce nom.

SelectNodes est donc plus expressif, comme vous pouvez écrire tout appel GetElementsByTagName comme un appel SelectNodes, mais pas l'inverse. XPath est un moyen très robuste d'exprimer des ensembles de nœuds XML, offrant de nouvelles possibilités de filtrage qu'un simple nom. XPath, par exemple, peut filtrer par nom de la balise, les noms d'attribut, le contenu intérieur et diverses fonctions d'agrégation sur les enfants de tag ainsi.

SelectNodes () est une extension Microsoft au modèle objet de document (DOM) ( msdn). SelectNodes comme mentionné par Welbog et d'autres prend l'expression XPath. Je voudrais mentionner la différence avec GetElementsByTagName () lors de la suppression noeud XML est nécessaire.

Réponse et code fourni utilisateur chilberto forum msdn

Le test suivant illustre la différence en réalisant la même fonction (suppression de noeuds de personne) mais en utilisant la méthode getElementByTagName () pour sélectionner les nœuds. Bien que le même type d'objet est retourné sa construction est différente. Les SelectNodes () est une collection de références revenir au document XML. Cela signifie que nous pouvons retirer du document dans un foreach sans affecter la liste des références. Ceci est illustré par le nombre de nodelist ne pas être affecté. Le getElementByTagName () est une collection qui reflète directement les nœuds du document. Cela signifie que l'on enlève les éléments de la mère, nous affectons en fait la collection de nœuds. Ceci est la raison pour laquelle la nodelist ne peut pas être manipulé dans un foreach mais a dû être changé à une boucle while.

.NET SelectNodes ()

    [TestMethod]
    public void TestSelectNodesBehavior()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(@"<root>
                               <person>
                                 <id>1</id>
                                 <name>j</name>
                                </person>
                                <person>
                                  <id>2</id>
                                  <name>j</name>
                                </person>
                                <person>
                                  <id>1</id>
                                  <name>j</name>
                                 </person>
                                 <person>
                                   <id>3</id>
                                   <name>j</name>
                                  </person>
                                  <business></business>
                                </root>");

        XmlNodeList nodeList = doc.SelectNodes("/root/person");

        Assert.AreEqual(5, doc.FirstChild.ChildNodes.Count, "There should have been a total of 5 nodes: 4 person nodes and 1 business node");
        Assert.AreEqual(4, nodeList.Count, "There should have been a total of 4 nodes");

        foreach (XmlNode n in nodeList)
            n.ParentNode.RemoveChild(n);

        Assert.AreEqual(1, doc.FirstChild.ChildNodes.Count, "There should have been only 1 business node left in the document");
        Assert.AreEqual(4, nodeList.Count, "There should have been a total of 4 nodes");
    }

.NET GetElementsByTagName ()

    [TestMethod]
    public void TestGetElementsByTagNameBehavior()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(@"<root>
                               <person>
                                 <id>1</id>
                                 <name>j</name>
                                </person>
                                <person>
                                  <id>2</id>
                                  <name>j</name>
                                </person>
                                <person>
                                  <id>1</id>
                                  <name>j</name>
                                 </person>
                                 <person>
                                   <id>3</id>
                                   <name>j</name>
                                  </person>
                                  <business></business>
                                </root>");;

        XmlNodeList nodeList = doc.GetElementsByTagName("person");

        Assert.AreEqual(5, doc.FirstChild.ChildNodes.Count, "There should have been a total of 5 nodes: 4 person nodes and 1 business node");
        Assert.AreEqual(4, nodeList.Count, "There should have been a total of 4 nodes");

        while (nodeList.Count > 0)
            nodeList[0].ParentNode.RemoveChild(nodeList[0]);

        Assert.AreEqual(1, doc.FirstChild.ChildNodes.Count, "There should have been only 1 business node left in the document");
        Assert.AreEqual(0, nodeList.Count, "All the nodes have been removed");
    }

Avec SelectNodes () nous obtenons collection / liste des références à des noeuds de document XML. Nous pouvons manipuler avec ces références. Si l'on supprime le noeud, le changement sera visible au document XML, mais la collection / liste des références est le même (bien que le noeud qui a été supprimé, ses points de référence maintenant null -> System.NullReferenceException) Bien que je ne sais pas vraiment comment cela est mis en œuvre. Je suppose que si nous utilisons XmlNodeList nodeList = GetElementsByTagName () et supprimer le noeud avec nodeList [i] .ParentNode.RemoveChild (nodeList [i]) est Libère / supprime la référence dans la variable nodeList.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top