On 12 Jan 2007 at 17:06, Rob Dixon wrote:

Hi Rob,

> > 
> > In the sample date below your'll see some addresses with "DO NOT..." 
> > in. I can locate them easily enough but I am struggling to navigate 
> > back up the DOM to access the code so I can record the code with 
> > faulty addresses.
> > 
> > Here my effort. Can anyone help me either to move backup up to the 
> > right element node or catch the code node before I begin to loop 
> > through the address line(s).
> > 
> > TIA,
> > Dp.
> > 
> > 
> > ======= My Effort ==========
#!/usr/bin/perl


my $file = 'ADDRESS.XML';
open(FH,$file) or die "Can't open file $file: $!\n";

my $parser = XML::LibXML->new;
my $doc = $parser->parse_fh(\*FH);

my @codes = $doc->findnodes('//code');
my @lines = $doc->findnodes('//lines');

for (my $i = 0; $i < $#codes; ++$i) {
        #print $codes[$i]->string_value, "\t";
        my @add = $lines[$i]->childNodes;
        for ( my $a = 1; $a <$#add; ++$a) {
                if ($add[$a]->string_value =~ /\s+NOT\s+/) {
                        print $codes[$i]->string_value,": ",$add[$a]-
>string_value,"\n";
                }
        }

> 
> If I understand you correctly then all you need is
> 
> my @results = $doc->findnodes('/dataroot/address[contains(lines/line, "DO NOT 
> USE")]');
> 
> foreach my $address (@results) {
>    my $code = $address->findvalue('code');
>    print $code, "\n";
> }
> 
> which prints the code of all those addresses that have a line containing 'DO 
> NOT 
> USE'. Is that what was required?
> 

Yes ...and no. I guess I want to print out the 'code' for any address 
so that I can get the data corrected but I guess I would also like to 
remove those records at the /dataroot/address level so they don't 
appear in the file.

i spent a lot of time on this today as this look like a excellent 
parser and DOM navigator but I struggled moving around.

In your example @results looks like it would contain references to 
all the /lines/line data with DO NOT USE in the string_value. What I 
have struggling with is that this is also a reference to the record 
as a whole and my navigation techniques are not working out. For 
example whenever I used findnodes I was getting every code in the 
file. I think now that was because I was using /dataroot/address as 
the starting point.

Aside from CPAN, I would appreciate any other sources of info about 
using the using libXML with perl and xpath expressions. It is 
whoppingly fast.

Thanx again,
Dp.


> 
> Rob



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to