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不会给我任何 perl libxml 的结果。我知道这个库做得很好,但我仍然需要解析这些东西,所以我认为基于 CSS 选择器的库可能会更成功。

4

3 回答 3

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 回答
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 回答
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 回答