Вопрос

каковы основные различия между SelectNodes и getElementsByTagName.

Это было полезно?

Решение

Выбранные узлы является специфичным для .NET / MSXML методом, который получает список совпадающих узлов для XPath - путь выражение лица.XPaths может выбирать элементы по имени тега, но также может выполнять множество других, более сложных правил выбора.

getElementByTagName Получить элементbytagname является ли базовый стандартный метод DOM уровня 1 доступным на многих языках (но пишется с большой буквы G в .NET).Он выбирает элементы только по имени тега;вы не можете попросить его выбрать элементы с определенным атрибутом или элементы с именем тега a внутри других элементов с именем тега b или что-нибудь умное в этом роде.Он старше, проще и в некоторых средах быстрее.

Другие советы

SelectNodes занимает XPath - путь выражение в качестве параметра и возвращает все узлы, соответствующие этому выражению.

GetElementsByTagName принимает имя тега в качестве параметра и возвращает все теги, которые имеют это имя.

SelectNodes поэтому является более выразительным, так как вы можете написать любой GetElementsByTagName вызов в качестве SelectNodes звони, но не наоборот.XPath - это очень надежный способ выражения наборов XML-узлов, предлагающий больше способов фильтрации, чем просто name.XPath, например, также может фильтровать по имени тега, именам атрибутов, внутреннему содержимому и различным агрегатным функциям дочерних элементов тега.

SelectNodes() - это расширение Microsoft для объектной модели документа (DOM) (msdn).SelectNodes, как упоминалось Welbog и другими, принимает выражение XPath.Я хотел бы упомянуть разницу с getElementsByTagName(), когда требуется удаление xml-узла.

Ответ и код предоставлены пользователем чильберто в форум msdn

Следующий тест иллюстрирует разницу, выполняя ту же функцию (удаляя узлы person), но используя метод getElementByTagName() для выбора узлов.Хотя возвращается один и тот же тип объекта, его конструкция отличается.SelectNodes() - это набор ссылок на XML-документ.Это означает, что мы можем удалить из документа в foreach, не затрагивая список ссылок.Это показано количеством nodelist, на которое это не влияет.getElementByTagName() - это коллекция, которая непосредственно отражает узлы в документе.Это означает, что, удаляя элементы в родительском файле, мы фактически влияем на коллекцию узлов.Вот почему списком узлов нельзя манипулировать в foreach, но его пришлось заменить на цикл 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");
    }

С помощью SelectNodes() мы получаем коллекцию / список ссылок на узлы xml-документа.Мы можем манипулировать этими ссылками.Если мы удалим узел, изменение будет видно в xml-документе, но коллекция / список ссылок останется прежним (хотя узел, который был удален, теперь ссылается на исключение null -> System.NullReferenceException) Хотя я действительно не знаю, как это реализовано.Я полагаю, если мы используем XmlNodeList NodeList = getElementsByTagName() и удалим узел с помощью NodeList[i].parentNode.removeChild(NodeList[i]) освобождает / удаляет ссылку в переменной NodeList.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top