Solved

XML::LibXML and Xpath syntax How do I get attribute of sibling

Posted on 2016-08-15
  • Perl
  • XML
  • Scripting Languages
  • Programming Languages-Other
  • Shell Scripting
  • +1
2
148 Views
Last Modified: 2016-08-21
This is follow on fromThis Question

In the xml bellow I need to locate the next 'link' after I've located 'images' within the parent 'entry'


I found this link that suggest can use "following-sibling" can someone see what I've  done wrong?  

note I've striped the xml down to simplify

Perl script
 
!C:\strawberry\perl\bin\perl.exe

use strict;
use warnings;
use XML::LibXML;
use XML::LibXML::XPathContext;
use Data::Dump qw(dump);


my $filename = 'georss.xml';

my $dom = XML::LibXML->load_xml(location => $filename);
my $xpc = XML::LibXML::XPathContext->new($dom);
$xpc->registerNs(dft => "http://www.w3.org/2005/Atom");
$xpc->registerNs(georss => "http://www.georss.org/georss");


foreach my $Entry ($xpc->findnodes("//dft:feed/dft:entry")) {

     foreach my $Images ($xpc->findnodes("/dft:title[not(\@type='text')]", $Entry)) {
         my $ImageVal = $Images->textContent;

          ####  This finds all the Images
         print "ImageVal $ImageVal\n";
         my $link = $Images->following-sibling::link[\@href];
         print "link $link\n";
         
     }

}

Open in new window


georss.xml
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" >
  <entry>
    <title>fileName1.jpg</title>
     <link href="PathTo/fileName1.jpg" />
  </entry>
  <entry>
    <title>fileName2.jpg</title>
     <link href="PathTo/fileName2.jpg" />
  </entry>
  <entry>
    <title>fileName3.jpg</title>
     <link href="PathTo/fileName3.jpg" />
  </entry>
  <entry>
    <title type="text">fileName.pdf</title>
     <link type="application/pdf"  href="PathTo/fileName.pdf" />
  </entry>
    <georss:where>
     <point xmlns="http://www.opengis.net/gml" srsName="urn:ogc:crs:EPSG:4326">
      <pos>45.256 -71.92</pos>
     </point>
  </georss:where>

</feed>

Open in new window

0
Comment
Question by:trevor1940
2 Comments
 
LVL 35

Accepted Solution

by:
Robert Schutt earned 500 total points
ID: 41763918
Try it like this:
foreach my $Entry ($xpc->findnodes("//dft:feed/dft:entry")) {

     foreach my $Images ($xpc->findnodes("./dft:title[not(\@type='text')]", $Entry)) {
         my $ImageVal = $Images->textContent;

          ####  This finds all the Images
         print "ImageVal $ImageVal\n";
         my $link = $xpc->findvalue('following-sibling::dft:link[1]/@href', $Images);
         print "link $link\n";
         
     }

}

Open in new window

0
 
LVL 1

Author Closing Comment

by:trevor1940
ID: 41764348
That worked thank you
0

Featured Post

Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question