プロが教えるわが家の防犯対策術!

MSXMLのDOMを使っているのですが、ノードを取得した際に、
実際読み込んだXMLの行数の取得は出来ないのでしょうか?

例えば、
1 <data>
2 <item>○○○○</item>
3 <item>××××</item>
4 <item>△△△△</item>
5 </data>
××××のitemノードを取得した際に、3行目という情報を
取得したい。

以上です。
ご教授ください。
よろしくお願いします。

A 回答 (3件)

===========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?知らんがな

この回答への補足

ありがとうございます。

試してみましたが、これだと、要素の順番を返すみたいです。

テキストの行数(改行数?)を取得する方法はないでしょうか?

補足日時:2010/02/22 14:19
    • good
    • 0

思いっきり勘違いしたorz


見つけたら報告する
    • good
    • 0

ギブアップ。

諦めた方が良い

DOMはおそらく設計的にテキストファイルとして扱うことを前提としてない。(#わざわざ行番号を使って何をしたいんだろう?とは思うのだけれど)

で、SAXを眺めてたらISAXLocatorに、linenumberがあるから出来るかな、とか期待したんだけど、

http://msdn.microsoft.com/en-us/library/ms753775 …

Javaのマニュアルにあるように

http://java.sun.com/j2se/1.5.0/docs/api/org/xml/ …

ソースコードの厳密な行番号を与えるものではなく、あくまでデバッグ目的用に曖昧な番号を示すものであり、少なくとも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)
    • good
    • 0
この回答へのお礼

わざわざ調べて頂いたみたいで、本当にありがとうございます。

XMLDOMParseErrorには、エラーの行数を返す関数があったので、出来るかと思っていましたが、難しいようですね。

ちなみに、やりたいことは、2ペインで、左が構造ツリー、右が編集エディタにして、構造ツリーをクリックすると編集エディタの頭だしをするというものです。

お礼日時:2010/02/23 08:35

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