2010-03-25 110 views
4

SelectNodes和GetElementsByTagName之間的主要區別是什麼。SelectNodes和GetElementsByTagName

+1

這是什麼編程語言或環境? – bmargulies

+0

來自http://msdn.microsoft.com/zh-cn/library/ms757828%28VS.85%29.aspx的XML DOM方法。有時我感到困惑。感謝你的答案。目前使用經典的asp retr retrive遠程xml節點,稍後我會嘗試使用.net – Jason

回答

8

SelectNodes是一個.NET/MSXML特定的方法,它獲取XPath表達式的匹配節點列表。 XPath可以通過標籤名稱選擇元素,但也可以執行很多其他更復雜的選擇規則。

getElementByTagName是一種可用於多種語言的DOM級別1核心標準方法(但與.NET中的首字母大寫G拼寫)。它僅通過標籤名稱選擇元素;你不能要求它選擇具有某個屬性的元素,或者標籤名稱爲a的元素在標籤名稱爲b的其他元素內或者其他任何聰明的元素。它更古老,更簡單,並且在某些環境下速度更快。

+0

注意GetElementByTagName(「NodeName」)(在.Net中)等價於SelectNodes(「// NodeName」),因爲它選擇所有節點名字無論父母的深度。而SelectNodes(「NodeName」)只選擇第一級別的孩子。通過使用Xpath,使用SelectNodes更具體。 –

3

SelectNodesXPath表達式作爲參數並返回與該表達式匹配的所有節點。

GetElementsByTagName將標記名稱作爲參數並返回所有具有該名稱的標記。

SelectNodes因此更具有表現力,因爲您可以將任何GetElementsByTagName呼叫寫爲SelectNodes呼叫,但不是相反。 XPath是表達XML節點集合的非常穩健的方式,提供了更多的過濾方式,而不僅僅是名稱。例如,XPath可以通過標籤名稱,屬性名稱,內部內容以及標籤子項上的各種聚合函數進行過濾。

0

SelectNodes()是文檔對象模型(DOM)(msdn)的Microsoft擴展。如Welbog和其他人所提到的SelectNodes需要XPath表達式。我想提及與GetElementsByTagName()的不同之處,當需要刪除xml節點時。

回答和代碼提供的用戶chilbertomsdn 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變量中的引用。