3

XMLドキュメントを解析でき、CSSセレクターと名前空間サポートを介してノードを選択できるPerlライブラリを知っている人はいますか?

背景:perl libxmlパッケージを使用してデフォルトの名前空間を持つドキュメントを解析しようとしましたが、ルートノードからデフォルトの名前空間を削除するまで何も返されませんでした。

これは私がトピックで見つけたものです: https ://mail.gnome.org/archives/xml/2003-April/msg00143.html

したがって、簡単な例は次のようなファイルになります。

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://example.com/ns">
  <message>Hi</message>
</root

XPath//messageは、perllibxmlで結果を表示しませんでした。ライブラリが完全に正常に機能していることはわかっていますが、それでも解析する必要があるため、CSSセレクターベースのライブラリの方が成功する可能性があると考えました。

4

3 に答える 3

1

これを試してください:

#!/usr/bin/perl

use XML::XPath;
use XML::XPath::XMLParser;

my $xp = XML::XPath->new(filename => 'test.xhtml');

print XML::XPath::XMLParser::as_string($_), "\n" for ($xp->find('root/message')->get_nodelist);
于 2012-06-16T14:16:30.677 に答える
1

これは、libxmlでスローできるものなら何でも機能するはずです。

use strictures;
use HTML::TreeBuilder::LibXML qw();
BEGIN { HTML::TreeBuilder::LibXML->replace_original; }
use Web::Query qw();

print Web::Query->new_from_html(<<'MARKUP')->find('root > message')->text;
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://example.com/ns">
<message>Hi</message>
</root>
MARKUP

1;
于 2012-06-16T14:39:30.317 に答える
0

あなたがそれをあまりにも言わない限り、XML::Twigは名前空間を喜んで無視します。要素名にハンドラーを設定するmessageか、次のようなXPathクエリを使用することでアクセスできます。my @messages= $twig->findnodes( '//message')

ハンドラーを使用するには、次のように記述します。

XML::Twig->new( twig_handlers => { message => \&process_message })
         ->parsefile( "my.xml"); )

sub process_message
  { my( $twig, $message)= @_;
    print $message->text;
  }
于 2012-06-16T15:23:04.083 に答える