Выбираем узлы и получаем элементыbytagname
-
22-09-2019 - |
Вопрос
каковы основные различия между 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.