Pergunta

Quais são as principais diferenças entre o SelectNodes e o GetSbyTagName.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top