無料Wikiサービス | デモページ
Linuxなどのメモ書き

Perl getElementById


XML::LibXMLのgetElementById()を使ってId指定でDOMノードを取得する際、HTMLにDTD定義がないとgetElementById()ではノードを取得できない(undefが返る)。これは、DTDがないとどれがID属性なのかわからないため。

DTD定義の無いHTML文書からid指定でDOMノードを取得する代替手段としてはXPath指定で取り出す方法がある。XPath式"//*[@id='xxxx']"を指定してfindnodes()をしてやればよい。ただし、getElementById()に比べて速度は遅くなるはず。

XPathによるid指定取得
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;

my $parser = XML::LibXML->new();
my $doc = $parser->parse_html_fh(\*DATA);
my $node = $doc->getElementById("test");
print "ById:", $node->textContent, "\n" if $node;

($node) = $doc->findnodes('//*[@id="test"]');
print "XPath:", $node->textContent, "\n" if $node;

__DATA__
<html>
  <body>
    <div id="test">block1</div>
    <div>block2</div>
  </body>
</html>
実行結果
$ perl getelement.pl
XPath:block1

参照

http://search.cpan.org/dist/XML-LibXML/lib/XML/LibXML/Document.pod

のgetElementById: Note部分にDTD有無時の動作について説明がある。

最終更新 2007/05/15 12:06:03 - kztomita
(2007/05/15 12:06:03 作成)