- ベストアンサー
各ノードの行数取得
MSXMLのDOMを使っているのですが、ノードを取得した際に、 実際読み込んだXMLの行数の取得は出来ないのでしょうか? 例えば、 1 <data> 2 <item>○○○○</item> 3 <item>××××</item> 4 <item>△△△△</item> 5 </data> ××××のitemノードを取得した際に、3行目という情報を 取得したい。 以上です。 ご教授ください。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ギブアップ。諦めた方が良い DOMはおそらく設計的にテキストファイルとして扱うことを前提としてない。(#わざわざ行番号を使って何をしたいんだろう?とは思うのだけれど) で、SAXを眺めてたらISAXLocatorに、linenumberがあるから出来るかな、とか期待したんだけど、 http://msdn.microsoft.com/en-us/library/ms753775%28VS.85%29.aspx Javaのマニュアルにあるように http://java.sun.com/j2se/1.5.0/docs/api/org/xml/sax/Locator.html ソースコードの厳密な行番号を与えるものではなく、あくまでデバッグ目的用に曖昧な番号を示すものであり、少なくともMSXMLは以下のように、属性区切り子に改行を用いたXMLの、要素の開始行番号を期待通りに返さなかった。 <data> <item id="hoge" kekeke="gag">○○○○</item> <item id="fuge"> <item id="fuga"> ×××× </item> </item> <item id="gura">△△△△</item> </data> =================試みたこと(役に立たないけど関心があれば)============ 実行するまでは上記の挙動であることに気付かず、実装してやろうと悩んだ。 IVBSAXContentHandlerの各イベントで渡されるのはノードではなく、要素名とか属性とか、そのテキストの内容。これだけでは、他のノードを拾ってしまいかねないので わざわざ数えてそれをIVBSAXContentHandlerを実装した独自クラスのメンバ変数に保存しておいて、イベントでカウントして、同じ数になったときに適用、というような方法を取っていた。ちゃんと一致するノードを取れているようではあったのだが、 上記の問題により断念せざるを得なかった Set dom = New DOMDocument60 dom.async = False dom.preserveWhiteSpace = True Dim succeed As Boolean succeed = dom.Load("C:\Environment\Users\WWW\OKWave\Q5696567\aaa.xml") dom.setProperty "SelectionLanguage", "XPath" Set element = dom.selectSingleNode("//*[@id='fuga']") Set nodes1 = element.selectNodes("preceding::node() | ancestor::node()") Dim x As Class1 Set x = New Class1 x.XXX = nodes1.Length Dim y As SAXXMLReader60 Set y = New SAXXMLReader60 Set y.contentHandler = x y.Parse (dom.XML)
その他の回答 (2)
- himajin100000
- ベストアンサー率54% (1660/3060)
思いっきり勘違いしたorz 見つけたら報告する
- himajin100000
- ベストアンサー率54% (1660/3060)
===========aaa.xml ちょっと改変したXML(idつけたのは要素取りやすくした以上の理由じゃない============== <data> <item id="hoge">○○○○</item> <item id="fuga">××××</item> <item id="gura">△△△△</item> </data> =================Excel VBAのコード(.NET支持者としてはあまりVBA触りたくないなあ)================= Option Explicit Sub Main() Dim dom As DOMDocument Dim nodelist As IXMLDOMNodeList Dim element As IXMLDOMElement Dim strPath As String Set dom = New DOMDocument dom.async = False dom.Load ("aaa.xml") dom.setProperty "SelectionLanguage", "XPath" Set element = dom.selectSingleNode("//*[@id='fuga']") Set nodelist = element.selectNodes("preceding-sibling::*") MsgBox ("Found " & CStr(nodelist.Length + 1) & " Node") ' Found 2 Node End Sub '参考にしたもの:(読み込んだのは、MSXML6だけどね) 'http://support.microsoft.com/kb/288913 'selectNodesに与えるXPath式を色々変えてみるべし '複数形のs?知らんがな
補足
ありがとうございます。 試してみましたが、これだと、要素の順番を返すみたいです。 テキストの行数(改行数?)を取得する方法はないでしょうか?
お礼
わざわざ調べて頂いたみたいで、本当にありがとうございます。 XMLDOMParseErrorには、エラーの行数を返す関数があったので、出来るかと思っていましたが、難しいようですね。 ちなみに、やりたいことは、2ペインで、左が構造ツリー、右が編集エディタにして、構造ツリーをクリックすると編集エディタの頭だしをするというものです。