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