I have some XML files where I want to use some information from them. I have written a code that reads those files and then looks for some conditions.
The problem is that these XML file begins with
<SquishReport version="2.1" xmlns="http://www.froglogic.com/XML2">
and Perl could not read them (at least in my code!). But When I am appending these lines in the first line of XML
file
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"?>
works very well.
Some lines from my XML file test.xml
:
<SquishReport version="2.1" xmlns="http://www.froglogic.com/XML2">
<test name="TEST">
<prolog time="2015-10-01T03:45:22+02:00"/>
<test name="tst_start_app">
<prolog time="2015-02-01T03:45:23+02:00"/>
<message line="38" type="LOG" file="C:\squish\test\sources.py" time="2015-02-01T03:45:23+02:00">
<description>
<![CDATA[>> >> >> start: init (global) - testcase C:\squish\test\tst_start_app]]></description>
</message>
</test>
</test>
</SquishReport>
and the Perl code for reading the XML file is:
use strict;
use warnings;
use feature 'say';
use XML::LibXML;
# Parse the XML
my $xml = XML::LibXML->load_xml(location => 'test.xml');
# Iterate the entries
for my $entry ($xml->findnodes('/SquishReport/test/test')) {
my $key = $entry->findvalue('@name');
say "$key";
}
Perl has so many excellent XML tools - thanks to all the module developers and
libxml2
, XML almost seems easy. One of those tools isXML::Dataset
- a convenience "scaffolding" module that builds onXML::LibXML
and uses a "profile" markup language to grab data from XML sources (NB: The profile mark-up is sensitive to whitespace and line endings).e.g.:
Squish.xml
:Output:
The root node of that document is an element which has name
SquishReport
in thehttp://www.froglogic.com/XML2
namespace. Concisely, we can say the root node is aWhen one uses
SquishReport
(as opposed toprefix:SquishReport
) in an XPath, that tries to match an element which has nameSquishReport
in the null namespace. Concisely, we can say it attempts to match aTo specify the namespace, one uses prefixes defined in a context, as follows:
Note: The prefix used in the XPath have no relation to the prefixes used in the XML document (if any). You are expected to know the namespace in which resides the elements for which you are searching, but not the prefixes used by a given document.