SelectNodes e GetElementsByTagName
-
22-09-2019 - |
Pergunta
Quais são as principais diferenças entre o SelectNodes e o GetSbyTagName.
Solução
SelectNodes é um método específico .NET/MSXML que obtém uma lista de nós correspondentes para um Xpath expressão. O XPaths pode selecionar elementos por nome da tag, mas também pode fazer muitas outras regras de seleção mais complicadas.
getElementByTagName é um método padrão principal de nível 1 DOM disponível em vários idiomas (mas escrito com um capital G
na rede). Ele seleciona elementos apenas pelo nome da tag; Você não pode pedir para selecionar elementos com um determinado atributo ou elementos com nome de tag a
Dentro de outros elementos com nome de tag b
ou qualquer coisa inteligente assim. É mais antigo, mais simples e em alguns ambientes mais rápido.
Outras dicas
SelectNodes
leva um Xpath expressão como um parâmetro e retorna todos os nós que correspondem a essa expressão.
GetElementsByTagName
pega um nome de tag como um parâmetro e retorna todas as tags que têm esse nome.
SelectNodes
é, portanto, mais expressivo, como você pode escrever qualquer GetElementsByTagName
ligue como um SelectNodes
Ligue, mas não o contrário. O XPath é uma maneira muito robusta de expressar conjuntos de nós XML, oferecendo mais maneiras de filtrar do que apenas nome. O XPath, por exemplo, pode filtrar o nome da tag, nomes de atributos, conteúdo interno e várias funções agregadas também no TAG Children.
SelectNodes () é uma extensão da Microsoft para o Modelo de Objeto do Documento (DOM) (msdn). SelectNodes, conforme mencionado por Welbog e outros, pega a expressão do XPath. Eu gostaria de mencionar a diferença com getElementsByTagName () quando a exclusão do nó XML for necessária.
Resposta e código fornecido pelo usuário Chilberto no Fórum MSDN
O próximo teste ilustra a diferença executando a mesma função (removendo os nós da pessoa), mas usando o método getElementByTagName () para selecionar os nós. Embora o mesmo tipo de objeto seja retornado, sua construção é diferente. O selectNodes () é uma coleção de referências de volta ao documento XML. Isso significa que podemos remover do documento em um foreach sem afetar a lista de referências. Isso é mostrado pela contagem da lista de nodelistas não ser afetada. O getElementByTagName () é uma coleção que reflete diretamente os nós no documento. Isso significa que, ao remover os itens do pai, na verdade afetamos a coleta de nós. É por isso que a lista de nodelas não pode ser manipulada em um foreach, mas teve que ser alterada para um loop de tempo.
.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");
}
Com selectNodes (), obtemos coleta / lista de referências aos nós do documento XML. Podemos manipular com essas referências. Se excluirmos o nó, a alteração será visível para o documento XML, mas a coleção / lista de referências é a mesma (embora o nó que foi excluído, é o ponto de referência agora para null -> System.NullReferenceException), embora eu não saiba como realmente não sei como saber como Isso é implementado. Suponho que se usarmos xmlnodelist nodelist = getElementsBytaGName () e excluir nó com nodelist [i] .parentnode.removeChild (nodelist [i]) é referência de liberas/exclui na variável NodeList.