XML::LibXML
使用一种样式,其中方法同时用作对象方法和类方法。这是为了方便。如果你打电话
XML::LibXML->load_xml
它将为您创建一个解析器对象,使用参数对其进行配置,加载XML,然后抛出解析器对象。
sub load_xml {
my $class_or_self = shift;
my %args = map { ref($_) eq 'HASH' ? (%$_) : $_ } @_;
my $URI = delete($args{URI});
$URI = "$URI" if defined $URI;
my $parser;
if (ref($class_or_self)) {
$parser = $class_or_self->_clone();
$parser->{XML_LIBXML_PARSER_OPTIONS} = $parser->_parser_options(\%args);
} else {
$parser = $class_or_self->new(\%args);
}
这意味着这两段代码是等效的。
my $dom = XML::LibXML->load_xml(
string => $inputstr
);
my $dom = XML::LibXML->new(
string => $inputstr
)->load_xml(
string => $inputstr
);
何时呼叫
new()
必需的
当您想要更改默认的解析器选项并重用解析器对象时。或者当您希望使用仅作为对象方法可用的方法时。
例如,您可能希望将配置好的XML解析器传递给另一个函数,或者使用它来配置另一个对象的行为。
my $parser = XML::LibXML->new(pedantic_parser => 1);
my $object = Some::Class->new(xml_parser => $parser);
$object->do_something_with_an_xml_document($document);