Thread HTML::TreeBuilder soll case sensitiv arbeiten (3 answers)
Opened by mcfaq at 2011-05-09 18:32

mcfaq
 2011-05-09 18:32
#148384 #148384
User since
2011-04-20
20 articles
BenutzerIn
[default_avatar]
Hallo.

Ich möchte eine html Datei parsen und dabei die Tags in ihrer Originalschreibweise ausgeben. Mein Ansatz dazu war wie folgt.

Datei cpan HTML/TreeBuilder.pm:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub new {                               # constructor!
    my $class = shift;
    $class = ref($class) || $class;

    # Initialize HTML::Element part
    my $self = $class->element_class->new('html');

    {

        # A hack for certain strange versions of Parser:
        my $other_self = HTML::Parser->new();
        %$self = ( %$self, %$other_self );    # copy fields
           # Yes, multiple inheritance is messy.  Kids, don't try this at home.
        bless $other_self, "HTML::TreeBuilder::_hideyhole";

        # whack it out of the HTML::Parser class, to avoid the destructor
    }


Möchte $other_self->case_sensitive("true"); aufrufen, damit der Parser die html tags nicht verändert.

Wie schaffe ich das am einfachsten? Ich habe bereits von TreeBuilder geerbt:


Datei test.pl:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use lib "/testscript/modules";
use TemplateTreeBuilder;

my $rootelement = TemplateTreeBuilder->new();

#Ich dachte durch diese Zeile würde es gehen. Aber Pustekuchen: Aber: Es gibt keine Fehlermeldung ?!?
$rootelement->case_sensitive(1);

#nicht standart html Tags werden mit in den Baum aufgenommen.
$rootelement->ignore_unknown(0);

#& in source stays as it is: no decode to &
$rootelement->no_expand_entities(1);

$rootelement->parse_file($ARGV[0]);


Datei TemplateTreeBuilder.pm:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl
package TemplateTreeBuilder;
use lib "/testproject/modules";
use MyElement;
use HTML::TreeBuilder;
#inherit from TreeBuilder
@ISA = qw(HTML::TreeBuilder);
#use parent qw/HTML::TreeBuilder/;

#constructor
sub new {
  my $class = shift;
  $class = ref($class) || $class;
  #invoke base constructor
  my $self = $class->SUPER::new(@_);
  $self->{_element_class}='MyElement';
  bless($self, $class);
  
  
  return $self;
}

return 1;



Datei MyElement.pm:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
package MyElement;
use HTML::Element;
#inherit from Element
@ISA = qw(HTML::Element);

*HTML::Element::_fold_case = \&HTML::Element::_fold_case_NOT; #overwrite the var from base class

#constructor
sub new {
  my $class = shift;
  $class = ref($class) || $class;
  #invoke base constructor
  my $self = $class->SUPER::new(@_);
  
  bless($self, $class);
  
  return $self;
}

return 1;




Für Tips zur richtigen Umsetzung wäre ich dankbar.

Gruß

mcfaq.

modedit Editiert von GwenDragon: Code in Abschnitte geteilt
Last edited: 2011-05-10 11:19:51 +0200 (CEST)

View full thread HTML::TreeBuilder soll case sensitiv arbeiten