SelectNodes和GetElementsByTagName之間的主要區別是什麼。SelectNodes和GetElementsByTagName
回答
SelectNodes是一個.NET/MSXML特定的方法,它獲取XPath表達式的匹配節點列表。 XPath可以通過標籤名稱選擇元素,但也可以執行很多其他更復雜的選擇規則。
getElementByTagName是一種可用於多種語言的DOM級別1核心標準方法(但與.NET中的首字母大寫G
拼寫)。它僅通過標籤名稱選擇元素;你不能要求它選擇具有某個屬性的元素,或者標籤名稱爲a
的元素在標籤名稱爲b
的其他元素內或者其他任何聰明的元素。它更古老,更簡單,並且在某些環境下速度更快。
注意GetElementByTagName(「NodeName」)(在.Net中)等價於SelectNodes(「// NodeName」),因爲它選擇所有節點名字無論父母的深度。而SelectNodes(「NodeName」)只選擇第一級別的孩子。通過使用Xpath,使用SelectNodes更具體。 –
SelectNodes
將XPath表達式作爲參數並返回與該表達式匹配的所有節點。
GetElementsByTagName
將標記名稱作爲參數並返回所有具有該名稱的標記。
SelectNodes
因此更具有表現力,因爲您可以將任何GetElementsByTagName
呼叫寫爲SelectNodes
呼叫,但不是相反。 XPath是表達XML節點集合的非常穩健的方式,提供了更多的過濾方式,而不僅僅是名稱。例如,XPath可以通過標籤名稱,屬性名稱,內部內容以及標籤子項上的各種聚合函數進行過濾。
SelectNodes()是文檔對象模型(DOM)(msdn)的Microsoft擴展。如Welbog和其他人所提到的SelectNodes需要XPath表達式。我想提及與GetElementsByTagName()的不同之處,當需要刪除xml節點時。
回答和代碼提供的用戶chilberto在msdn forum
下一個測試示出了通過執行相同的功能(除去個人節點),但通過使用GetElementByTagName()方法來選擇所述節點的所述差。雖然返回相同的對象類型,但其構造不同。 SelectNodes()是返回到xml文檔的引用的集合。這意味着我們可以在不影響引用列表的情況下從文檔中刪除。這由節點列表的計數不受影響顯示。 GetElementByTagName()是一個直接反映文檔中節點的集合。這意味着當我們刪除父項中的項時,我們實際上會影響節點的集合。這就是爲什麼nodelist不能在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變量中的引用。
- 1. XPath和SelectNodes方法
- 2. Spidermonkey和getElementsByTagName
- 3. 行爲的loadXML和的SelectNodes
- 4. Webkit文檔和GetElementsByTagName
- 5. 爲querySelectorAll和的getElementsByTagName
- 6. 結合getElementsByTagName和getElementsByClassName
- 7. getElementsByTagName
- 8. Android中的SelectNodes?
- 9. SelectNodes返回null
- 10. 的XPath的SelectNodes
- 11. 的XPath的SelectNodes
- 12. PHP DOMDocument和getElementsByTagName問題?
- 13. 的getElementsByTagName在Chrome和Safari
- 14. 使用getElementsByTagName和getAttribute方法
- 15. HtmlAgilityPack的SelectNodes,處置
- 16. 的SelectNodes與篩選
- 17. double getElementsByTagName
- 18. Javascript getElementsByTagName
- 19. SelectNodes with XPath忽略個案
- 20. HtmlAgilityPack SelectNodes空指針異常
- 21. SelectNodes不返回子值
- 22. C#XML解析的SelectNodes
- 23. HtmlAgilityPack.HtmlNode沒有定義爲SelectNodes
- 24. C#XmlDocument SelectNodes不起作用
- 25. TableRows上的RDLC SelectNodes元素
- 26. 的毗連2的SelectNodes htmlagilitypack
- 27. PHP DOMDocument getElementsByTagname?
- 28. VBA getelementsbytagname問題
- 29. GetElementsByTagName(tag).length
- 30. DOMDocument getElementsByTagName not working
這是什麼編程語言或環境? – bmargulies
來自http://msdn.microsoft.com/zh-cn/library/ms757828%28VS.85%29.aspx的XML DOM方法。有時我感到困惑。感謝你的答案。目前使用經典的asp retr retrive遠程xml節點,稍後我會嘗試使用.net – Jason