SelectNodes e GetElementsByTagName
-
22-09-2019 - |
Domanda
quali sono le principali differenze tra SelectNodes e GetElementsByTagName.
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.