No.1
- 回答日時:
===========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?知らんがな
この回答への補足
ありがとうございます。
試してみましたが、これだと、要素の順番を返すみたいです。
テキストの行数(改行数?)を取得する方法はないでしょうか?
No.3ベストアンサー
- 回答日時:
ギブアップ。
諦めた方が良い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)
わざわざ調べて頂いたみたいで、本当にありがとうございます。
XMLDOMParseErrorには、エラーの行数を返す関数があったので、出来るかと思っていましたが、難しいようですね。
ちなみに、やりたいことは、2ペインで、左が構造ツリー、右が編集エディタにして、構造ツリーをクリックすると編集エディタの頭だしをするというものです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- ノートパソコン パソコンで悩んでいます。 今三年生で建築を学んでいるものです。 使っていたパソコンが壊れてしまったた 4 2023/04/22 03:47
- SEO googleサーチコンソールでの重複ページ(ダブルスラッシュ) 3 2023/06/12 15:00
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
- その他(IT・Webサービス) html cssについて 3 2023/05/13 12:48
- PHP 10文字以降は非表示にしたいんですが、文法が分かりませんアドバイスお願い致します 1 2022/07/10 20:37
- MySQL mysqlで INSERT と SELECTの用途は 1 2022/04/01 00:45
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
SNMP リンクダウンとノードダ...
-
昔Winnyってありましたけど、あ...
-
同じタグ名の項目取得
-
ツリービューの使い方が・・・
-
各ノードの行数取得
-
C#でtreeviewの指定ノードを選...
-
XML文書の指定した属性値を持つ...
-
木のなぞり順をかえるプログラ...
-
C言語:文字列の並び替え
-
TreeVIewのノード名を編集する...
-
コンテキストメニュークリック...
-
2分探索木の高さを求めるプロ...
-
ツリービューのノードをダブル...
-
ルート要素ノードが2個ある場合?
-
2分木と双方向線形リストを同時...
-
あるノードリストに、特定の名...
-
最長経路探索
-
東芝のDynabookなのですがアン...
-
タグの有無の判定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
昔Winnyってありましたけど、あ...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
同じタグ名の項目取得
-
あるノードリストに、特定の名...
-
ノードとは
-
TreeView の初期表示について
-
ツリービューのノードをダブル...
-
ノード数とは?
-
コンテキストメニュークリック...
-
XML文書の指定した属性値を持つ...
-
C#でtreeviewの指定ノードを選...
-
複数のマックPCによる数値計算...
-
VB6.0ツリービューについて
-
TreeViewの再表示のちらつきを...
-
VB6.0でDOMを使用して...
-
vbsのDOMDocumentで要素のText...
-
TreeViewで複数ノードの選択は...
-
C# TreeView 効率良いノード追...
おすすめ情報