SelectNodes と GetElementsByTagName の主な違いは何ですか。
3 に答える
SelectNodesは、 XPath式に一致するノードのリストを取得する .NET/MSXML 固有のメソッドです。XPath はタグ名で要素を選択できますが、他の多くのより複雑な選択規則も実行できます。
getElementByTagNameは、多くの言語で使用できる DOM Level 1 Core 標準メソッドです (ただしG
、.NET ではスペルが大文字になります)。タグ名だけで要素を選択します。a
特定の属性を持つ要素、またはタグ名を持つ他の要素内のタグ名を持つ要素、またはb
そのような巧妙なものを選択するように要求することはできません。より古く、よりシンプルで、一部の環境ではより高速です。
SelectNodes
XPath式をパラメーターとして取り、その式に一致するすべてのノードを返します。
GetElementsByTagName
タグ名をパラメータとして取り、その名前を持つすべてのタグを返します。
SelectNodes
GetElementsByTagName
したがって、任意の呼び出しを呼び出しとして記述できますが、SelectNodes
その逆はできないため、より表現力があります。XPath は、一連の XML ノードを表現するための非常に堅牢な方法であり、名前だけでなく、より多くのフィルタリング方法を提供します。たとえば、XPath は、タグ名、属性名、内部コンテンツ、およびタグの子に対するさまざまな集計関数によってもフィルター処理できます。
SelectNodes() は、Document Object Model (DOM) ( msdn ) に対する Microsoft の拡張機能です。Welbog などで言及されている SelectNodes は、XPath 式を取ります。xml ノードの削除が必要な場合の GetElementsByTagName() との違いについて言及したいと思います。
回答とコードは、msdn フォーラムでユーザーchilberto に提供されました
次のテストでは、同じ関数を実行する (人物ノードを削除する) ことによって違いを示しますが、GetElementByTagName() メソッドを使用してノードを選択します。同じオブジェクト タイプが返されますが、その構造は異なります。SelectNodes() は、xml ドキュメントへの参照のコレクションです。つまり、参照のリストに影響を与えることなく、 foreach でドキュメントから削除できます。これは、影響を受けていないノードリストの数によって示されます。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 変数の解放/削除参照になると思います。