【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?

VB.NETでSystem.Xmlを参照設定して以下のXMLファイル(test.xml)のsub4_9のtestの個数を得たいのですが
domNode = domDoc.SelectSingleNode("top/sub4_9/test")
Console.WriteLine("Count of top/sub4_9/test = " & domNode.?????)
というようにしましたが?????の部分にLengthやCountがありません。
また、
rootElement = domDoc.DocumentElement
domNodeList = rootElement.GetElementsByTagName("sub4_9/test")
Console.WriteLine("Count of top/sub4_9/test = " & domNodeList.Count)
というようにもしてみましたが個数は誤った0が返されます。
どのように記述すればsub4_9のtestの個数を得ることができるでしょうか。
----test.xml-------------
<top>
 <sub1_1>
  <test>123</test>
  <test>451</test>
   :
 </sub1_1>
   :
 <sub4_9>
  <test>432</test>
  <test>123</test>
  <test>745</test>
   :
 </sub4_9>
   :
 <sub9_5>
  <test>222</test>
   :
 </sub9_5>
</top>
--VB.NET------------------------
Imports System.Xml
Imports System.IO
Module Module1
 Sub Main()
  Dim domDoc As New XmlDocument
  Dim domNode As XmlNode
  Dim domNodeList As XmlNodeList
  Dim rootElement As XmlElement
  domDoc.Load("test.xml")
  rootElement = domDoc.DocumentElement
  domNode = domDoc.SelectSingleNode("top/sub4_9/test")
  Console.WriteLine("Count of top/sub4_9/test = " & domNode.?????)
  domNodeList = rootElement.GetElementsByTagName("sub4_9/test")
  Console.WriteLine("Count of top/sub4_9/test = " & domNodeList.Count)
 End Sub
End Module
-----------------------------------
よろしくお願いします
(WindpwsXP,VisualStudio2010)

A 回答 (2件)

そりゃ,Select「Single」Nodeメソッドを呼び出したのですから,ひとつしか返ってきませんよ。


また,GetElementsByTagNameは要素名を引数にとるのであってXPathを引数にとらないのですから,/が入っていれば当然0個が返ります。

使うべきは,SelectNodesメソッドかと思います。
これは,XPathで指定したノードのリスト (XmlNodeList) を返します。
こちらには,Countプロパティがちゃんとあります。
    • good
    • 0
この回答へのお礼

Yune-Kichiさん

ありがとうございます。

SelectSingleNode()をSelectNodes()に替えてみたらできました。

domNodeList = domDoc.SelectNodes("top/sub4_9/test")
Console.WriteLine("Count of top/sub4_9/test = " & domNodeList.Count)

もし、よろしければGetElementsByTagName()についても教えて欲しいのですが

rootElement.GetElementsByTagName()というように、ルートから検索する例はいろいろあったのですが、ルートの1つ下のsub4_9という要素から検索させることはできるのでしょうか。

よろしくお願いします。

お礼日時:2012/10/18 08:29

XPath /top/*/test をSelectNodesせずに得たい,ということでしょうか。


XmlElementからXmlElementのコレクションを簡単に得られないので,SelectNodesするのが一番簡単なのですが……。

一応,
rootElement.Children.OfType<XmlElement>().SelectMany(e => e.GetElementsByTagName("test").Cast<XmlElement>())
でIEnumerable<XmlElement>が得られます。
XmlNodeにはGetElementsByTagNameがないため,/top/*の各要素に対してGetElementsByTagNameを呼び出す,という形になっています。
# ここまでLINQ使うならXDocument系使って .Root.Elements().Elements("test") としたいところ。
    • good
    • 0
この回答へのお礼

< >やe=>などがあって難しいそうなので
基本的にはSelectNodes()を使って、
GetElementsByTagName()はルートからの検索のみに使うようにします。
ありがとうございました。

お礼日時:2012/10/19 09:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報