代码之家  ›  专栏  ›  技术社区  ›  Kwabena

perlXML::LibXML何时需要new()调用

  •  0
  • Kwabena  · 技术社区  · 1 年前

    我使用perl的XML::LibXML编写了一个程序

    它使用load_XML()创建XML::LibXML。

    我很惊讶它不需要调用new()。

    什么时候需要调用new()?

    以下是令人惊讶(对我来说)有效的代码:

    #!/usr/bin/env perl
    use 5.020;
    use warnings;
    use XML::LibXML;
    
    #the input xml
    my $inputstr = <<XML;
    <a>
    <b class="type1">some type 1 data</b>
    <b class="type2">some type 2 data</b>
    <b class="type3">some type 3 data</b>
    <b class="type4">some type 4 data</b>
    <b notaclass="type1">don't change this</b>
    <c class="type1">don't change this either</c>
    </a>
    XML
    
    my $dom = XML::LibXML->load_xml(
    string => $inputstr
    );
    
    say $dom->toString();
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Schwern    1 年前

    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; # stringify in case it is an URI object
      my $parser;
      # if called as an object method
      if (ref($class_or_self)) { 
        $parser = $class_or_self->_clone();
        $parser->{XML_LIBXML_PARSER_OPTIONS} = $parser->_parser_options(\%args);
      # if called as a class method
      } 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);
    
    # This will use $parser which has been configured to be pedantic.
    $object->do_something_with_an_xml_document($document);
    
    推荐文章