3

この例のオンライン HTML テーブルから "hello" というテキストを取得する VBA コードの一部を教えてください。最初のノードは、彼の ID (id="something") によって検出されます。

...
<table id="something">
  <tr>
    <td><TABLE><TR><TD></TD></TR><TR><TD></TD></TR></TABLE></td><td></td>
  </tr>
  <tr>
    <td></td><td></td><td>hello</td>
  </tr>
...

のようなものになると思いますがchild->sibling->child->sibling->sibling->child、正確な方法はわかりません。

EDIT 更新コード タグは大文字です。それで、私がgetElemenetsById("something").getElemenetsByTagName('tr')それを使用すると、コレクションに 2 つの tr タグのみを取得するか、または 4 つ (より深い子であるタグを使用) を取得しますか?

4

2 に答える 2

5

答えを検索した場合は、次回は範囲を広げたいと思うかもしれません。DOM や VBA に関する質問と回答がたくさんあります。

HTMLDocument の代わりに HTMLElement で getElementById を使用する

質問 (および回答) は、まさにあなたが望むものではありませんが、作業できるものを作成する方法を示します。

目的の「こんにちは」を取得するにはgetElementById()、 とを組み合わせて使用​​する必要があります。getElemenetsByTagName()

例えば:Document.getElementById("something").getElementsByTagName("tr")(1).getElementsByTagName("td")(2).innerText

  • 要素「何か」を取得する
  • 「something」内ですべての「tr」タグを取得します (具体的にはインデックス 1 のタグ)。
  • 返された tr タグ内で、すべての「td」タグ (具体的にはインデックス 2 のタグ) を取得します。
  • 前の結果の innerText を取得します

これらのオブジェクトは 0 ベースの配列を使用するため、最初の項目は item(0) です。

アップデート

document.getElementById()(単一の) IHTMLElement (そのすべての子を含む)を返すか、存在しない場合は何も返さないか null を返します。

document.getElementsByTagName()IHTMLElementのコレクションを返します (ここでも、各要素にはそのすべての子が含まれます)。(存在しない場合は空のコレクション)

document.getElementsByTagName("tr")これにより、「document」要素内のすべての tr 要素が返されます。

document.getElementsByTagName("tr")(0)コレクションから最初の(単数形の) IHTMLElementを返します。(末尾のインデックスに注意してください。)

VBA には InternetExplorer オブジェクトの「兄弟」機能がない (私が見つけた) ので、子インデックスを使用して手動で行う必要があります。

DOM 関数を使用すること、それを行うためのクリーンな方法です。チェーン「Element.Children(0).children(1).children(2)」を見るよりもはるかに明確です。手動で調べないとインデックスの意味がわからないからです。

于 2013-04-22T11:14:55.320 に答える