Domanda

quali sono le principali differenze tra SelectNodes e GetElementsByTagName.

È stato utile?

Soluzione

SelectNodes è un .NET / metodo di MSXML-specifico che ottiene un elenco di nodi di corrispondenza per un espressione XPath . XPaths possono selezionare gli elementi per nome tag, ma può anche fare un sacco di altri, regole di selezione più complicate.

getElementByTagName è un DOM Level metodo standard 1 core disponibile in molte lingue (ma scritto con un G capitale NET). Si seleziona gli elementi solo per nome tag; non si può chiedere per selezionare gli elementi con un determinato attributo, o elementi con nome di tag a all'interno di altri elementi con nome di tag b o qualcosa di intelligente del genere. E 'più vecchio, più semplice e più veloce in alcuni ambienti.

Altri suggerimenti

SelectNodes prende un href="http://www.w3schools.com/xpath/" rel="nofollow noreferrer"> XPath espressione come parametro e restituisce tutti i nodi che corrispondono a questa espressione.

GetElementsByTagName prende un nome tag da usare come parametro e restituisce tutti i tag che hanno quel nome.

SelectNodes è quindi più espressivo, come si può scrivere qualsiasi chiamata GetElementsByTagName come una chiamata SelectNodes, ma non il contrario. XPath è un modo molto robusto di esprimere serie di nodi XML, che offre più modalità di filtraggio di un semplice nome. XPath, per esempio, può filtrare per nome del tag, i nomi degli attributi, contenuto interno e le varie funzioni di aggregazione sui bambini tag pure.

SelectNodes () è un'estensione Microsoft al Document Object Model (DOM) ( MSDN ). SelectNodes come menzionato da Welbog e altri prende espressione XPath. Vorrei citare differenza con GetElementsByTagName () quando è necessaria l'eliminazione di nodo XML.

Rispondi e codice fornito all'utente chilberto a MSDN forum

Il test successivo illustra la differenza eseguendo la stessa funzione (rimuovendo i nodi persona) ma utilizzando il metodo GetElementByTagName () per selezionare i nodi. Se lo stesso tipo di oggetto viene restituita la sua costruzione è differente. I SelectNodes () è una raccolta di riferimenti indietro al documento XML. Questo significa che siamo in grado di rimuovere dal documento in un foreach senza influenzare la lista dei riferimenti. Ciò è dimostrato dal conteggio del nodelist non essere colpiti. Il GetElementByTagName () è una collezione che riflette direttamente i nodi del documento. Ciò significa che dal momento che eliminiamo gli elementi nel genitore, abbiamo effettivamente influenzare l'insieme di nodi. Questo è il motivo per cui il nodelist non può essere manipolata in un foreach, ma ha dovuto essere cambiato in un ciclo 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");
    }

Con SelectNodes () otteniamo raccolta / elenco di riferimenti ai nodi documento XML. Siamo in grado di manipolare con tali riferimenti. Se si elimina il nodo, il cambiamento sarà visibile al documento XML, ma la raccolta / lista di riferimenti è lo stesso (anche se il nodo che è stato cancellato, è punto di riferimento ormai per nulla -> System.NullReferenceException) Anche se non so come questo è implementato. Suppongo che se usiamo XmlNodeList nodeList = GetElementsByTagName () e cancellare nodo con nodeList [i] .ParentNode.RemoveChild (nodeList [i]) è FreeS / cancella riferimento nella variabile nodeList.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top