← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/share/koha/opac/cgi-bin/opac/opac-search.pl
  Run on Tue Oct 15 11:58:52 2013
Reported on Tue Oct 15 12:01:53 2013

Filename/usr/lib/perl5/XML/LibXML.pm
StatementsExecuted 15507 statements in 89.2ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
74938413.3ms13.3msXML::LibXML::Node::::DESTROY XML::LibXML::Node::DESTROY (xsub)
501112.8ms12.8msXML::LibXML::::_parse_string XML::LibXML::_parse_string (xsub)
16472112.7ms23.4msXML::LibXML::Node::::childNodes XML::LibXML::Node::childNodes
67813111.1ms11.1msXML::LibXML::Node::::localname XML::LibXML::Node::localname (xsub)
48612110.7ms10.7msXML::LibXML::Node::::nodeType XML::LibXML::Node::nodeType (xsub)
16471110.6ms10.6msXML::LibXML::Node::::_childNodes XML::LibXML::Node::_childNodes (xsub)
16191110.6ms18.3msXML::LibXML::Node::::attributes XML::LibXML::Node::attributes
3147118.75ms8.75msXML::LibXML::Node::::nodeValue XML::LibXML::Node::nodeValue (xsub)
1619117.72ms7.72msXML::LibXML::Node::::_attributes XML::LibXML::Node::_attributes (xsub)
4200217.48ms7.48msXML::LibXML::Node::::namespaceURI XML::LibXML::Node::namespaceURI (xsub)
2581116.47ms6.47msXML::LibXML::Attr::::value XML::LibXML::Attr::value (xsub)
4200215.84ms5.84msXML::LibXML::Node::::prefix XML::LibXML::Node::prefix (xsub)
1619113.92ms3.92msXML::LibXML::Node::::nodeName XML::LibXML::Node::nodeName (xsub)
2581113.74ms3.74msXML::LibXML::Attr::::name XML::LibXML::Attr::name (xsub)
1113.53ms6.42msXML::LibXML::::BEGIN@23 XML::LibXML::BEGIN@23
4112.80ms2.83msXML::LibXML::::_parse_file XML::LibXML::_parse_file (xsub)
1619112.80ms2.80msXML::LibXML::Node::::getNamespaces XML::LibXML::Node::getNamespaces (xsub)
54212.60ms5.70msXML::LibXML::::_init_callbacks XML::LibXML::_init_callbacks
50222.53ms24.6msXML::LibXML::::parse_string XML::LibXML::parse_string
54211.22ms2.68msXML::LibXML::::_cleanup_callbacks XML::LibXML::_cleanup_callbacks
80321.12ms1.48msXML::LibXML::InputCallback::::init_callbacks XML::LibXML::InputCallback::init_callbacks
53321.07ms1.07msXML::LibXML::::new XML::LibXML::new
111909µs1.15msXML::LibXML::::BEGIN@25 XML::LibXML::BEGIN@25
111857µs857µsXML::LibXML::::bootstrap XML::LibXML::bootstrap (xsub)
8032844µs1.09msXML::LibXML::InputCallback::::cleanup_callbacks XML::LibXML::InputCallback::cleanup_callbacks
111842µs3.78msXML::LibXML::::BEGIN@24 XML::LibXML::BEGIN@24
5421745µs1.61msXML::LibXML::::_auto_expand XML::LibXML::_auto_expand
10821660µs660µsXML::LibXML::::match_callback XML::LibXML::match_callback
7921604µs604µsXML::LibXML::::__parser_option XML::LibXML::__parser_option
5422591µs591µsXML::LibXML::InputCallback::::new XML::LibXML::InputCallback::new
5411512µs863µsXML::LibXML::::expand_xinclude XML::LibXML::expand_xinclude
5311502µs604µsXML::LibXML::Namespace::::nodeName XML::LibXML::Namespace::nodeName
5411437µs437µsXML::LibXML::InputCallback::::unregister_callbacks XML::LibXML::InputCallback::unregister_callbacks
5021426µs678µsXML::LibXML::::recover XML::LibXML::recover
10641411µs411µsXML::LibXML::Namespace::::DESTROY XML::LibXML::Namespace::DESTROY (xsub)
26842409µs409µsXML::LibXML::Namespace::::localname XML::LibXML::Namespace::localname (xsub)
15931398µs398µsXML::LibXML::Namespace::::href XML::LibXML::Namespace::href (xsub)
2511369µs1.05msXML::LibXML::::recover_silently XML::LibXML::recover_silently
5411364µs364µsXML::LibXML::::open_callback XML::LibXML::open_callback
8011359µs359µsXML::LibXML::InputCallback::::lib_init_callbacks XML::LibXML::InputCallback::lib_init_callbacks (xsub)
5411313µs313µsXML::LibXML::::read_callback XML::LibXML::read_callback
5411265µs265µsXML::LibXML::::close_callback XML::LibXML::close_callback
2811246µs246µsXML::LibXML::Node::::ownerDocument XML::LibXML::Node::ownerDocument (xsub)
8011244µs244µsXML::LibXML::InputCallback::::lib_cleanup_callbacks XML::LibXML::InputCallback::lib_cleanup_callbacks (xsub)
3911206µs206µsXML::LibXML::Node::::getData XML::LibXML::Node::getData (xsub)
5311206µs206µsXML::LibXML::Namespace::::name XML::LibXML::Namespace::name
886182µs3.05msXML::LibXML::::import XML::LibXML::import
422149µs3.67msXML::LibXML::::parse_file XML::LibXML::parse_file
111117µs1.58msXML::LibXML::::BEGIN@28 XML::LibXML::BEGIN@28
281186µs86µsXML::LibXML::Document::::getVersion XML::LibXML::Document::getVersion (xsub)
281186µs86µsXML::LibXML::Document::::externalSubset XML::LibXML::Document::externalSubset (xsub)
281180µs80µsXML::LibXML::Document::::encoding XML::LibXML::Document::encoding (xsub)
281170µs70µsXML::LibXML::Document::::version XML::LibXML::Document::version (xsub)
11166µs66µsXML::LibXML::::END XML::LibXML::END (xsub)
62260µs60µsXML::LibXML::InputCallback::::_callback_match XML::LibXML::InputCallback::_callback_match
281151µs51µsXML::LibXML::Document::::getEncoding XML::LibXML::Document::getEncoding (xsub)
11145µs73µsXML::LibXML::Attr::::BEGIN@1732 XML::LibXML::Attr::BEGIN@1732
11133µs465µsXML::LibXML::::BEGIN@234 XML::LibXML::BEGIN@234
11133µs33µsXML::LibXML::::LIBXML_RUNTIME_VERSION XML::LibXML::LIBXML_RUNTIME_VERSION (xsub)
11131µs61µsXML::LibXML::::VERSION XML::LibXML::VERSION
11128µs93µsXML::LibXML::Document::::BEGIN@1359 XML::LibXML::Document::BEGIN@1359
11124µs141µsXML::LibXML::::BEGIN@18 XML::LibXML::BEGIN@18
11123µs28µsXML::LibXML::::BEGIN@13 XML::LibXML::BEGIN@13
11119µs82µsXML::LibXML::::BEGIN@21 XML::LibXML::BEGIN@21
11119µs118µsXML::LibXML::::BEGIN@20 XML::LibXML::BEGIN@20
11118µs94µsXML::LibXML::::BEGIN@159 XML::LibXML::BEGIN@159
11116µs40µsXML::LibXML::::BEGIN@26 XML::LibXML::BEGIN@26
11116µs64µsXML::LibXML::Text::::BEGIN@1663 XML::LibXML::Text::BEGIN@1663
11115µs109µsXML::LibXML::Element::::BEGIN@1481 XML::LibXML::Element::BEGIN@1481
11115µs44µsXML::LibXML::::BEGIN@178 XML::LibXML::BEGIN@178
11115µs60µsXML::LibXML::::BEGIN@163 XML::LibXML::BEGIN@163
11114µs14µsXML::LibXML::_SAXParser::::BEGIN@1933 XML::LibXML::_SAXParser::BEGIN@1933
11113µs77µsXML::LibXML::InputCallback::::BEGIN@2077 XML::LibXML::InputCallback::BEGIN@2077
93113µs13µsXML::LibXML::::CORE:match XML::LibXML::CORE:match (opcode)
11113µs51µsXML::LibXML::::BEGIN@166 XML::LibXML::BEGIN@166
11112µs342µsXML::LibXML::NamedNodeMap::::BEGIN@1831 XML::LibXML::NamedNodeMap::BEGIN@1831
11112µs44µsXML::LibXML::DocumentFragment::::BEGIN@1455XML::LibXML::DocumentFragment::BEGIN@1455
11111µs41µsXML::LibXML::Comment::::BEGIN@1716 XML::LibXML::Comment::BEGIN@1716
11111µs679µsXML::LibXML::Element::::BEGIN@1480 XML::LibXML::Element::BEGIN@1480
11110µs49µsXML::LibXML::::BEGIN@160 XML::LibXML::BEGIN@160
11110µs37µsXML::LibXML::Dtd::::BEGIN@1754 XML::LibXML::Dtd::BEGIN@1754
11110µs34µsXML::LibXML::CDATASection::::BEGIN@1723 XML::LibXML::CDATASection::BEGIN@1723
11110µs218µsXML::LibXML::::BEGIN@14 XML::LibXML::BEGIN@14
11110µs36µsXML::LibXML::Element::::BEGIN@1478 XML::LibXML::Element::BEGIN@1478
11110µs33µsXML::LibXML::PI::::BEGIN@1765 XML::LibXML::PI::BEGIN@1765
1119µs43µsXML::LibXML::::BEGIN@259 XML::LibXML::BEGIN@259
1119µs74µsXML::LibXML::::BEGIN@35 XML::LibXML::BEGIN@35
1119µs42µsXML::LibXML::::BEGIN@167 XML::LibXML::BEGIN@167
1119µs40µsXML::LibXML::::BEGIN@165 XML::LibXML::BEGIN@165
1119µs40µsXML::LibXML::::BEGIN@173 XML::LibXML::BEGIN@173
1118µs39µsXML::LibXML::::BEGIN@162 XML::LibXML::BEGIN@162
1118µs38µsXML::LibXML::::BEGIN@175 XML::LibXML::BEGIN@175
1118µs42µsXML::LibXML::::BEGIN@164 XML::LibXML::BEGIN@164
1118µs39µsXML::LibXML::::BEGIN@168 XML::LibXML::BEGIN@168
1118µs38µsXML::LibXML::::BEGIN@172 XML::LibXML::BEGIN@172
1118µs39µsXML::LibXML::::BEGIN@170 XML::LibXML::BEGIN@170
1118µs39µsXML::LibXML::::BEGIN@161 XML::LibXML::BEGIN@161
1118µs38µsXML::LibXML::::BEGIN@169 XML::LibXML::BEGIN@169
1118µs38µsXML::LibXML::::BEGIN@174 XML::LibXML::BEGIN@174
1118µs46µsXML::LibXML::::BEGIN@171 XML::LibXML::BEGIN@171
1118µs38µsXML::LibXML::::BEGIN@176 XML::LibXML::BEGIN@176
1118µs38µsXML::LibXML::::BEGIN@177 XML::LibXML::BEGIN@177
1117µs7µsXML::LibXML::::LIBXML_VERSION XML::LibXML::LIBXML_VERSION (xsub)
1116µs6µsXML::LibXML::InputCallback::::BEGIN@2079 XML::LibXML::InputCallback::BEGIN@2079
1114µs4µsXML::LibXML::::threads_shared_enabled XML::LibXML::threads_shared_enabled
0000s0sXML::LibXML::Attr::::setNamespace XML::LibXML::Attr::setNamespace
0000s0sXML::LibXML::::CLONE XML::LibXML::CLONE
0000s0sXML::LibXML::::CLONE_SKIP XML::LibXML::CLONE_SKIP
0000s0sXML::LibXML::Document::::actualEncoding XML::LibXML::Document::actualEncoding
0000s0sXML::LibXML::Document::::insertPI XML::LibXML::Document::insertPI
0000s0sXML::LibXML::Document::::insertProcessingInstruction XML::LibXML::Document::insertProcessingInstruction
0000s0sXML::LibXML::Document::::process_xinclude XML::LibXML::Document::process_xinclude
0000s0sXML::LibXML::Document::::serialize XML::LibXML::Document::serialize
0000s0sXML::LibXML::Document::::setDocumentElement XML::LibXML::Document::setDocumentElement
0000s0sXML::LibXML::Document::::toString XML::LibXML::Document::toString
0000s0sXML::LibXML::DocumentFragment::::toStringXML::LibXML::DocumentFragment::toString
0000s0sXML::LibXML::Element::::appendWellBalancedChunk XML::LibXML::Element::appendWellBalancedChunk
0000s0sXML::LibXML::Element::::getAttribute XML::LibXML::Element::getAttribute
0000s0sXML::LibXML::Element::::getAttributeNS XML::LibXML::Element::getAttributeNS
0000s0sXML::LibXML::Element::::getChildrenByLocalName XML::LibXML::Element::getChildrenByLocalName
0000s0sXML::LibXML::Element::::getChildrenByTagName XML::LibXML::Element::getChildrenByTagName
0000s0sXML::LibXML::Element::::getChildrenByTagNameNS XML::LibXML::Element::getChildrenByTagNameNS
0000s0sXML::LibXML::Element::::getElementsByLocalName XML::LibXML::Element::getElementsByLocalName
0000s0sXML::LibXML::Element::::getElementsByTagName XML::LibXML::Element::getElementsByTagName
0000s0sXML::LibXML::Element::::getElementsByTagNameNS XML::LibXML::Element::getElementsByTagNameNS
0000s0sXML::LibXML::Element::::setAttribute XML::LibXML::Element::setAttribute
0000s0sXML::LibXML::Element::::setAttributeNS XML::LibXML::Element::setAttributeNS
0000s0sXML::LibXML::Element::::setNamespace XML::LibXML::Element::setNamespace
0000s0sXML::LibXML::InputCallback::::CLONE_SKIP XML::LibXML::InputCallback::CLONE_SKIP
0000s0sXML::LibXML::InputCallback::::_callback_close XML::LibXML::InputCallback::_callback_close
0000s0sXML::LibXML::InputCallback::::_callback_open XML::LibXML::InputCallback::_callback_open
0000s0sXML::LibXML::InputCallback::::_callback_read XML::LibXML::InputCallback::_callback_read
0000s0sXML::LibXML::InputCallback::::register_callbacks XML::LibXML::InputCallback::register_callbacks
0000s0sXML::LibXML::NamedNodeMap::::CLONE_SKIP XML::LibXML::NamedNodeMap::CLONE_SKIP
0000s0sXML::LibXML::NamedNodeMap::::getNamedItem XML::LibXML::NamedNodeMap::getNamedItem
0000s0sXML::LibXML::NamedNodeMap::::getNamedItemNS XML::LibXML::NamedNodeMap::getNamedItemNS
0000s0sXML::LibXML::NamedNodeMap::::item XML::LibXML::NamedNodeMap::item
0000s0sXML::LibXML::NamedNodeMap::::length XML::LibXML::NamedNodeMap::length
0000s0sXML::LibXML::NamedNodeMap::::new XML::LibXML::NamedNodeMap::new
0000s0sXML::LibXML::NamedNodeMap::::nodes XML::LibXML::NamedNodeMap::nodes
0000s0sXML::LibXML::NamedNodeMap::::removeNamedItem XML::LibXML::NamedNodeMap::removeNamedItem
0000s0sXML::LibXML::NamedNodeMap::::removeNamedItemNS XML::LibXML::NamedNodeMap::removeNamedItemNS
0000s0sXML::LibXML::NamedNodeMap::::setNamedItem XML::LibXML::NamedNodeMap::setNamedItem
0000s0sXML::LibXML::NamedNodeMap::::setNamedItemNS XML::LibXML::NamedNodeMap::setNamedItemNS
0000s0sXML::LibXML::Namespace::::CLONE_SKIP XML::LibXML::Namespace::CLONE_SKIP
0000s0sXML::LibXML::Namespace::::getName XML::LibXML::Namespace::getName
0000s0sXML::LibXML::Namespace::::getNamespaceURI XML::LibXML::Namespace::getNamespaceURI
0000s0sXML::LibXML::Namespace::::getNamespaces XML::LibXML::Namespace::getNamespaces
0000s0sXML::LibXML::Namespace::::getPrefix XML::LibXML::Namespace::getPrefix
0000s0sXML::LibXML::Namespace::::isEqualNode XML::LibXML::Namespace::isEqualNode
0000s0sXML::LibXML::Namespace::::isSameNode XML::LibXML::Namespace::isSameNode
0000s0sXML::LibXML::Namespace::::prefix XML::LibXML::Namespace::prefix
0000s0sXML::LibXML::Node::::CLONE_SKIP XML::LibXML::Node::CLONE_SKIP
0000s0sXML::LibXML::Node::::exists XML::LibXML::Node::exists
0000s0sXML::LibXML::Node::::find XML::LibXML::Node::find
0000s0sXML::LibXML::Node::::findbool XML::LibXML::Node::findbool
0000s0sXML::LibXML::Node::::findnodes XML::LibXML::Node::findnodes
0000s0sXML::LibXML::Node::::findvalue XML::LibXML::Node::findvalue
0000s0sXML::LibXML::Node::::getChildNodes XML::LibXML::Node::getChildNodes
0000s0sXML::LibXML::Node::::isSupported XML::LibXML::Node::isSupported
0000s0sXML::LibXML::Node::::nonBlankChildNodes XML::LibXML::Node::nonBlankChildNodes
0000s0sXML::LibXML::Node::::setOwnerDocument XML::LibXML::Node::setOwnerDocument
0000s0sXML::LibXML::Node::::toStringC14N XML::LibXML::Node::toStringC14N
0000s0sXML::LibXML::Node::::toStringEC14N XML::LibXML::Node::toStringEC14N
0000s0sXML::LibXML::PI::::setData XML::LibXML::PI::setData
0000s0sXML::LibXML::Pattern::::CLONE_SKIP XML::LibXML::Pattern::CLONE_SKIP
0000s0sXML::LibXML::Pattern::::new XML::LibXML::Pattern::new
0000s0sXML::LibXML::RegExp::::CLONE_SKIP XML::LibXML::RegExp::CLONE_SKIP
0000s0sXML::LibXML::RegExp::::new XML::LibXML::RegExp::new
0000s0sXML::LibXML::RelaxNG::::CLONE_SKIP XML::LibXML::RelaxNG::CLONE_SKIP
0000s0sXML::LibXML::RelaxNG::::new XML::LibXML::RelaxNG::new
0000s0sXML::LibXML::Schema::::CLONE_SKIP XML::LibXML::Schema::CLONE_SKIP
0000s0sXML::LibXML::Schema::::new XML::LibXML::Schema::new
0000s0sXML::LibXML::Text::::attributes XML::LibXML::Text::attributes
0000s0sXML::LibXML::Text::::deleteDataString XML::LibXML::Text::deleteDataString
0000s0sXML::LibXML::Text::::replaceDataRegEx XML::LibXML::Text::replaceDataRegEx
0000s0sXML::LibXML::Text::::replaceDataString XML::LibXML::Text::replaceDataString
0000s0sXML::LibXML::XPathExpression::::CLONE_SKIP XML::LibXML::XPathExpression::CLONE_SKIP
0000s0sXML::LibXML::_SAXParser::::CLONE_SKIP XML::LibXML::_SAXParser::CLONE_SKIP
0000s0sXML::LibXML::_SAXParser::::error XML::LibXML::_SAXParser::error
0000s0sXML::LibXML::_SAXParser::::fatal_error XML::LibXML::_SAXParser::fatal_error
0000s0sXML::LibXML::_SAXParser::::warning XML::LibXML::_SAXParser::warning
0000s0sXML::LibXML::::__proxy_registry XML::LibXML::__proxy_registry
0000s0sXML::LibXML::::__read XML::LibXML::__read
0000s0sXML::LibXML::::__write XML::LibXML::__write
0000s0sXML::LibXML::::_clone XML::LibXML::_clone
0000s0sXML::LibXML::::_html_options XML::LibXML::_html_options
0000s0sXML::LibXML::::_parser_options XML::LibXML::_parser_options
0000s0sXML::LibXML::::base_uri XML::LibXML::base_uri
0000s0sXML::LibXML::::callbacks XML::LibXML::callbacks
0000s0sXML::LibXML::::clean_namespaces XML::LibXML::clean_namespaces
0000s0sXML::LibXML::::complete_attributes XML::LibXML::complete_attributes
0000s0sXML::LibXML::::createDocument XML::LibXML::createDocument
0000s0sXML::LibXML::::expand_entities XML::LibXML::expand_entities
0000s0sXML::LibXML::::finish_push XML::LibXML::finish_push
0000s0sXML::LibXML::::gdome_dom XML::LibXML::gdome_dom
0000s0sXML::LibXML::::get_option XML::LibXML::get_option
0000s0sXML::LibXML::::init_push XML::LibXML::init_push
0000s0sXML::LibXML::::input_callbacks XML::LibXML::input_callbacks
0000s0sXML::LibXML::::keep_blanks XML::LibXML::keep_blanks
0000s0sXML::LibXML::::line_numbers XML::LibXML::line_numbers
0000s0sXML::LibXML::::load_ext_dtd XML::LibXML::load_ext_dtd
0000s0sXML::LibXML::::load_html XML::LibXML::load_html
0000s0sXML::LibXML::::load_xml XML::LibXML::load_xml
0000s0sXML::LibXML::::no_network XML::LibXML::no_network
0000s0sXML::LibXML::::option_exists XML::LibXML::option_exists
0000s0sXML::LibXML::::parse_balanced_chunk XML::LibXML::parse_balanced_chunk
0000s0sXML::LibXML::::parse_chunk XML::LibXML::parse_chunk
0000s0sXML::LibXML::::parse_fh XML::LibXML::parse_fh
0000s0sXML::LibXML::::parse_html_fh XML::LibXML::parse_html_fh
0000s0sXML::LibXML::::parse_html_file XML::LibXML::parse_html_file
0000s0sXML::LibXML::::parse_html_string XML::LibXML::parse_html_string
0000s0sXML::LibXML::::parse_xml_chunk XML::LibXML::parse_xml_chunk
0000s0sXML::LibXML::::pedantic_parser XML::LibXML::pedantic_parser
0000s0sXML::LibXML::::processXIncludes XML::LibXML::processXIncludes
0000s0sXML::LibXML::::process_xincludes XML::LibXML::process_xincludes
0000s0sXML::LibXML::::push XML::LibXML::push
0000s0sXML::LibXML::::set_handler XML::LibXML::set_handler
0000s0sXML::LibXML::::set_option XML::LibXML::set_option
0000s0sXML::LibXML::::set_options XML::LibXML::set_options
0000s0sXML::LibXML::::validation XML::LibXML::validation
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1# $Id: LibXML.pm 809 2009-10-04 21:17:41Z pajas $
2#
3#
4# This is free software, you may use it and distribute it under the same terms as
5# Perl itself.
6#
7# Copyright 2001-2003 AxKit.com Ltd., 2002-2006 Christian Glahn, 2006-2009 Petr Pajas
8#
9#
10
11package XML::LibXML;
12
13341µs232µs
# spent 28µs (23+5) within XML::LibXML::BEGIN@13 which was called: # once (23µs+5µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 13
use strict;
# spent 28µs making 1 call to XML::LibXML::BEGIN@13 # spent 5µs making 1 call to strict::import
1416µs1208µs
# spent 218µs (10+208) within XML::LibXML::BEGIN@14 which was called: # once (10µs+208µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 17
use vars qw($VERSION $ABI_VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS
# spent 208µs making 1 call to vars::import
15 $skipDTD $skipXMLDeclaration $setTagCompression
16 $MatchCB $ReadCB $OpenCB $CloseCB %PARSER_FLAGS
17245µs1218µs );
# spent 218µs making 1 call to XML::LibXML::BEGIN@14
18361µs2258µs
# spent 141µs (24+117) within XML::LibXML::BEGIN@18 which was called: # once (24µs+117µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 18
use Carp;
# spent 141µs making 1 call to XML::LibXML::BEGIN@18 # spent 117µs making 1 call to Exporter::import
19
20375µs2217µs
# spent 118µs (19+99) within XML::LibXML::BEGIN@20 which was called: # once (19µs+99µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 20
use constant XML_XMLNS_NS => 'http://www.w3.org/2000/xmlns/';
# spent 118µs making 1 call to XML::LibXML::BEGIN@20 # spent 99µs making 1 call to constant::import
21354µs2146µs
# spent 82µs (19+63) within XML::LibXML::BEGIN@21 which was called: # once (19µs+63µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 21
use constant XML_XML_NS => 'http://www.w3.org/XML/1998/namespace';
# spent 82µs making 1 call to XML::LibXML::BEGIN@21 # spent 63µs making 1 call to constant::import
22
233289µs16.42ms
# spent 6.42ms (3.53+2.89) within XML::LibXML::BEGIN@23 which was called: # once (3.53ms+2.89ms) by XML::LibXML::SAX::Parser::BEGIN@15 at line 23
use XML::LibXML::Error;
# spent 6.42ms making 1 call to XML::LibXML::BEGIN@23
243209µs13.78ms
# spent 3.78ms (842µs+2.93) within XML::LibXML::BEGIN@24 which was called: # once (842µs+2.93ms) by XML::LibXML::SAX::Parser::BEGIN@15 at line 24
use XML::LibXML::NodeList;
# spent 3.78ms making 1 call to XML::LibXML::BEGIN@24
253150µs11.15ms
# spent 1.15ms (909µs+237µs) within XML::LibXML::BEGIN@25 which was called: # once (909µs+237µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 25
use XML::LibXML::XPathContext;
# spent 1.15ms making 1 call to XML::LibXML::BEGIN@25
26370µs264µs
# spent 40µs (16+24) within XML::LibXML::BEGIN@26 which was called: # once (16µs+24µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 26
use IO::Handle; # for FH reads called as methods
# spent 40µs making 1 call to XML::LibXML::BEGIN@26 # spent 24µs making 1 call to Exporter::import
27
28
# spent 1.58ms (117µs+1.46) within XML::LibXML::BEGIN@28 which was called: # once (117µs+1.46ms) by XML::LibXML::SAX::Parser::BEGIN@15 at line 153
BEGIN {
2911µs$VERSION = "1.70"; # VERSION TEMPLATE: DO NOT CHANGE
301400ns$ABI_VERSION = 2;
3111µsrequire Exporter;
3212µsrequire DynaLoader;
33124µs@ISA = qw(DynaLoader Exporter);
34
353410µs2140µs
# spent 74µs (9+65) within XML::LibXML::BEGIN@35 which was called: # once (9µs+65µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 35
use vars qw($__PROXY_NODE_REGISTRY $__threads_shared $__PROXY_NODE_REGISTRY_MUTEX $__loaded);
# spent 74µs making 1 call to XML::LibXML::BEGIN@35 # spent 65µs making 1 call to vars::import
36
37
# spent 61µs (31+29) within XML::LibXML::VERSION which was called: # once (31µs+29µs) by XML::LibXSLT::BEGIN@16 at line 16 of XML/LibXSLT.pm
sub VERSION {
3812µs my $class = shift;
3913µs my ($caller) = caller;
4011µs my $req_abi = $ABI_VERSION;
41115µs25µs if (UNIVERSAL::can($caller,'REQUIRE_XML_LIBXML_ABI_VERSION')) {
# spent 3µs making 1 call to UNIVERSAL::can # spent 1µs making 1 call to XML::LibXSLT::REQUIRE_XML_LIBXML_ABI_VERSION
42 $req_abi = $caller->REQUIRE_XML_LIBXML_ABI_VERSION();
43 } elsif ($caller eq 'XML::LibXSLT') {
44 # XML::LibXSLT without REQUIRE_XML_LIBXML_ABI_VERSION is an old and incompatible version
45 $req_abi = 1;
46 }
4711µs unless ($req_abi == $ABI_VERSION) {
48 my $ver = @_ ? ' '.$_[0] : '';
49 die ("This version of $caller requires XML::LibXML$ver (ABI $req_abi), which is incompatible with currently installed XML::LibXML $VERSION (ABI $ABI_VERSION). Please upgrade $caller, XML::LibXML, or both!");
50 }
51138µs125µs return $class->UNIVERSAL::VERSION(@_)
# spent 25µs making 1 call to UNIVERSAL::VERSION
52}
53
54#-------------------------------------------------------------------------#
55# export information #
56#-------------------------------------------------------------------------#
57124µs%EXPORT_TAGS = (
58 all => [qw(
59 XML_ELEMENT_NODE
60 XML_ATTRIBUTE_NODE
61 XML_TEXT_NODE
62 XML_CDATA_SECTION_NODE
63 XML_ENTITY_REF_NODE
64 XML_ENTITY_NODE
65 XML_PI_NODE
66 XML_COMMENT_NODE
67 XML_DOCUMENT_NODE
68 XML_DOCUMENT_TYPE_NODE
69 XML_DOCUMENT_FRAG_NODE
70 XML_NOTATION_NODE
71 XML_HTML_DOCUMENT_NODE
72 XML_DTD_NODE
73 XML_ELEMENT_DECL
74 XML_ATTRIBUTE_DECL
75 XML_ENTITY_DECL
76 XML_NAMESPACE_DECL
77 XML_XINCLUDE_END
78 XML_XINCLUDE_START
79 encodeToUTF8
80 decodeFromUTF8
81 XML_XMLNS_NS
82 XML_XML_NS
83 )],
84 libxml => [qw(
85 XML_ELEMENT_NODE
86 XML_ATTRIBUTE_NODE
87 XML_TEXT_NODE
88 XML_CDATA_SECTION_NODE
89 XML_ENTITY_REF_NODE
90 XML_ENTITY_NODE
91 XML_PI_NODE
92 XML_COMMENT_NODE
93 XML_DOCUMENT_NODE
94 XML_DOCUMENT_TYPE_NODE
95 XML_DOCUMENT_FRAG_NODE
96 XML_NOTATION_NODE
97 XML_HTML_DOCUMENT_NODE
98 XML_DTD_NODE
99 XML_ELEMENT_DECL
100 XML_ATTRIBUTE_DECL
101 XML_ENTITY_DECL
102 XML_NAMESPACE_DECL
103 XML_XINCLUDE_END
104 XML_XINCLUDE_START
105 )],
106 encoding => [qw(
107 encodeToUTF8
108 decodeFromUTF8
109 )],
110 ns => [qw(
111 XML_XMLNS_NS
112 XML_XML_NS
113 )],
114 );
115
116@EXPORT_OK = (
117114µs @{$EXPORT_TAGS{all}},
118 );
119
120@EXPORT = (
12119µs @{$EXPORT_TAGS{all}},
122 );
123
124#-------------------------------------------------------------------------#
125# initialization of the global variables #
126#-------------------------------------------------------------------------#
1271500ns$skipDTD = 0;
1281400ns$skipXMLDeclaration = 0;
1291400ns$setTagCompression = 0;
130
1311600ns$MatchCB = undef;
1321300ns$ReadCB = undef;
1331300ns$OpenCB = undef;
1341400ns$CloseCB = undef;
135
136# if ($threads::threads) {
137# our $__THREADS_TID = 0;
138# eval q{
139# use threads::shared;
140# our $__PROXY_NODE_REGISTRY_MUTEX :shared = 0;
141# };
142# die $@ if $@;
143# }
144#-------------------------------------------------------------------------#
145# bootstrapping #
146#-------------------------------------------------------------------------#
147114µs11.46msbootstrap XML::LibXML $VERSION;
# spent 1.46ms making 1 call to DynaLoader::bootstrap
148110µsundef &AUTOLOAD;
149
15013µs*encodeToUTF8 = \&XML::LibXML::Common::encodeToUTF8;
15116µs*decodeFromUTF8 = \&XML::LibXML::Common::decodeFromUTF8;
152
153151µs11.58ms} # BEGIN
# spent 1.58ms making 1 call to XML::LibXML::BEGIN@28
154
155
156#-------------------------------------------------------------------------#
157# libxml2 node names (see also XML::LibXML::Common #
158#-------------------------------------------------------------------------#
159356µs2171µs
# spent 94µs (18+77) within XML::LibXML::BEGIN@159 which was called: # once (18µs+77µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 159
use constant XML_ELEMENT_NODE => 1;
# spent 94µs making 1 call to XML::LibXML::BEGIN@159 # spent 77µs making 1 call to constant::import
160333µs288µs
# spent 49µs (10+39) within XML::LibXML::BEGIN@160 which was called: # once (10µs+39µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 160
use constant XML_ATTRIBUTE_NODE => 2;
# spent 49µs making 1 call to XML::LibXML::BEGIN@160 # spent 39µs making 1 call to constant::import
161329µs271µs
# spent 39µs (8+31) within XML::LibXML::BEGIN@161 which was called: # once (8µs+31µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 161
use constant XML_TEXT_NODE => 3;
# spent 39µs making 1 call to XML::LibXML::BEGIN@161 # spent 31µs making 1 call to constant::import
162328µs269µs
# spent 39µs (8+30) within XML::LibXML::BEGIN@162 which was called: # once (8µs+30µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 162
use constant XML_CDATA_SECTION_NODE => 4;
# spent 39µs making 1 call to XML::LibXML::BEGIN@162 # spent 30µs making 1 call to constant::import
163334µs2106µs
# spent 60µs (15+46) within XML::LibXML::BEGIN@163 which was called: # once (15µs+46µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 163
use constant XML_ENTITY_REF_NODE => 5;
# spent 60µs making 1 call to XML::LibXML::BEGIN@163 # spent 46µs making 1 call to constant::import
164336µs276µs
# spent 42µs (8+34) within XML::LibXML::BEGIN@164 which was called: # once (8µs+34µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 164
use constant XML_ENTITY_NODE => 6;
# spent 42µs making 1 call to XML::LibXML::BEGIN@164 # spent 34µs making 1 call to constant::import
165336µs272µs
# spent 40µs (9+31) within XML::LibXML::BEGIN@165 which was called: # once (9µs+31µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 165
use constant XML_PI_NODE => 7;
# spent 40µs making 1 call to XML::LibXML::BEGIN@165 # spent 31µs making 1 call to constant::import
166334µs288µs
# spent 51µs (13+37) within XML::LibXML::BEGIN@166 which was called: # once (13µs+37µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 166
use constant XML_COMMENT_NODE => 8;
# spent 51µs making 1 call to XML::LibXML::BEGIN@166 # spent 38µs making 1 call to constant::import
167330µs276µs
# spent 42µs (9+33) within XML::LibXML::BEGIN@167 which was called: # once (9µs+33µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 167
use constant XML_DOCUMENT_NODE => 9;
# spent 42µs making 1 call to XML::LibXML::BEGIN@167 # spent 33µs making 1 call to constant::import
168329µs270µs
# spent 39µs (8+31) within XML::LibXML::BEGIN@168 which was called: # once (8µs+31µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 168
use constant XML_DOCUMENT_TYPE_NODE => 10;
# spent 39µs making 1 call to XML::LibXML::BEGIN@168 # spent 31µs making 1 call to constant::import
169335µs269µs
# spent 38µs (8+30) within XML::LibXML::BEGIN@169 which was called: # once (8µs+30µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 169
use constant XML_DOCUMENT_FRAG_NODE => 11;
# spent 38µs making 1 call to XML::LibXML::BEGIN@169 # spent 30µs making 1 call to constant::import
170328µs270µs
# spent 39µs (8+31) within XML::LibXML::BEGIN@170 which was called: # once (8µs+31µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 170
use constant XML_NOTATION_NODE => 12;
# spent 39µs making 1 call to XML::LibXML::BEGIN@170 # spent 31µs making 1 call to constant::import
171332µs284µs
# spent 46µs (8+38) within XML::LibXML::BEGIN@171 which was called: # once (8µs+38µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 171
use constant XML_HTML_DOCUMENT_NODE => 13;
# spent 46µs making 1 call to XML::LibXML::BEGIN@171 # spent 38µs making 1 call to constant::import
172337µs269µs
# spent 38µs (8+30) within XML::LibXML::BEGIN@172 which was called: # once (8µs+30µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 172
use constant XML_DTD_NODE => 14;
# spent 38µs making 1 call to XML::LibXML::BEGIN@172 # spent 31µs making 1 call to constant::import
173328µs272µs
# spent 40µs (9+32) within XML::LibXML::BEGIN@173 which was called: # once (9µs+32µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 173
use constant XML_ELEMENT_DECL => 15;
# spent 40µs making 1 call to XML::LibXML::BEGIN@173 # spent 32µs making 1 call to constant::import
174328µs268µs
# spent 38µs (8+30) within XML::LibXML::BEGIN@174 which was called: # once (8µs+30µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 174
use constant XML_ATTRIBUTE_DECL => 16;
# spent 38µs making 1 call to XML::LibXML::BEGIN@174 # spent 30µs making 1 call to constant::import
175332µs268µs
# spent 38µs (8+30) within XML::LibXML::BEGIN@175 which was called: # once (8µs+30µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 175
use constant XML_ENTITY_DECL => 17;
# spent 38µs making 1 call to XML::LibXML::BEGIN@175 # spent 30µs making 1 call to constant::import
176328µs269µs
# spent 38µs (8+31) within XML::LibXML::BEGIN@176 which was called: # once (8µs+31µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 176
use constant XML_NAMESPACE_DECL => 18;
# spent 38µs making 1 call to XML::LibXML::BEGIN@176 # spent 31µs making 1 call to constant::import
177328µs268µs
# spent 38µs (8+30) within XML::LibXML::BEGIN@177 which was called: # once (8µs+30µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 177
use constant XML_XINCLUDE_START => 19;
# spent 38µs making 1 call to XML::LibXML::BEGIN@177 # spent 30µs making 1 call to constant::import
1783451µs274µs
# spent 44µs (15+29) within XML::LibXML::BEGIN@178 which was called: # once (15µs+29µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 178
use constant XML_XINCLUDE_END => 20;
# spent 44µs making 1 call to XML::LibXML::BEGIN@178 # spent 29µs making 1 call to constant::import
179
180
181
# spent 3.05ms (182µs+2.87) within XML::LibXML::import which was called 8 times, avg 382µs/call: # once (39µs+629µs) by XML::LibXML::Element::BEGIN@1480 at line 1480 # once (27µs+476µs) by Authen::CAS::Client::BEGIN@12 at line 12 of Authen/CAS/Client.pm # once (11µs+335µs) by XML::LibXSLT::BEGIN@16 at line 16 of XML/LibXSLT.pm # once (16µs+323µs) by XML::LibXML::Common::BEGIN@28 at line 28 of XML/LibXML/Common.pm # once (18µs+317µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 15 of XML/LibXML/SAX/Parser.pm # once (23µs+307µs) by XML::LibXML::NamedNodeMap::BEGIN@1831 at line 1831 # once (34µs+241µs) by C4::XSLT::BEGIN@34 at line 34 of /usr/share/koha/lib/C4/XSLT.pm # once (14µs+243µs) by XML::LibXSLT::StylesheetWrapper::BEGIN@312 at line 312 of XML/LibXSLT.pm
sub import {
182815µs my $package=shift;
183845µs43µs if (grep /^:threads_shared$/, @_) {
# spent 3µs making 4 calls to XML::LibXML::CORE:match, avg 875ns/call
184 require threads;
185 if (!defined($__threads_shared)) {
186 if (INIT_THREAD_SUPPORT()) {
187 eval q{
188 use threads::shared;
189 share($__PROXY_NODE_REGISTRY_MUTEX);
190 };
191 if ($@) { # something went wrong
192 DISABLE_THREAD_SUPPORT(); # leave the library in a usable state
193 die $@; # and die
194 }
195 $__PROXY_NODE_REGISTRY = XML::LibXML::HashTable->new();
196 $__threads_shared=1;
197 } else {
198 croak("XML::LibXML or Perl compiled without ithread support!");
199 }
200 } elsif (!$__threads_shared) {
201 croak("XML::LibXML already loaded without thread support. Too late to enable thread support!");
202 }
203 } elsif (defined $XML::LibXML::__loaded) {
20467µs $__threads_shared=0 if not defined $__threads_shared;
205 }
2068102µs12282µs __PACKAGE__->export_to_level(1,$package,grep !/^:threads(_shared)?$/,@_);
# spent 281µs making 8 calls to Exporter::export_to_level, avg 35µs/call # spent 1µs making 4 calls to XML::LibXML::CORE:match, avg 350ns/call
207}
208
209
# spent 4µs within XML::LibXML::threads_shared_enabled which was called: # once (4µs+0s) by XML::LibXSLT::BEGIN@23 at line 42 of XML/LibXSLT.pm
sub threads_shared_enabled {
21016µs return $__threads_shared ? 1 : 0;
211}
212
213# if ($threads::threads) {
214# our $__PROXY_NODE_REGISTRY = XML::LibXML::HashTable->new();
215# }
216
217#-------------------------------------------------------------------------#
218# test exact version (up to patch-level) #
219#-------------------------------------------------------------------------#
220{
221262µs241µs my ($runtime_version) = LIBXML_RUNTIME_VERSION() =~ /^(\d+)/;
# spent 33µs making 1 call to XML::LibXML::LIBXML_RUNTIME_VERSION # spent 8µs making 1 call to XML::LibXML::CORE:match
222116µs17µs if ( $runtime_version < LIBXML_VERSION ) {
# spent 7µs making 1 call to XML::LibXML::LIBXML_VERSION
223 warn "Warning: XML::LibXML compiled against libxml2 ".LIBXML_VERSION.
224 ", but runtime libxml2 is older $runtime_version\n";
225 }
226}
227
228
229#-------------------------------------------------------------------------#
230# parser flags #
231#-------------------------------------------------------------------------#
232
233# Copied directly from http://xmlsoft.org/html/libxml-parser.html#xmlParserOption
234
# spent 465µs (33+432) within XML::LibXML::BEGIN@234 which was called: # once (33µs+432µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 257
use constant {
235128µs1432µs XML_PARSE_RECOVER => 1, # recover on errors
# spent 432µs making 1 call to constant::import
236 XML_PARSE_NOENT => 2, # substitute entities
237 XML_PARSE_DTDLOAD => 4, # load the external subset
238 XML_PARSE_DTDATTR => 8, # default DTD attributes
239 XML_PARSE_DTDVALID => 16, # validate with the DTD
240 XML_PARSE_NOERROR => 32, # suppress error reports
241 XML_PARSE_NOWARNING => 64, # suppress warning reports
242 XML_PARSE_PEDANTIC => 128, # pedantic error reporting
243 XML_PARSE_NOBLANKS => 256, # remove blank nodes
244 XML_PARSE_SAX1 => 512, # use the SAX1 interface internally
245 XML_PARSE_XINCLUDE => 1024, # Implement XInclude substitition
246 XML_PARSE_NONET => 2048, # Forbid network access
247 XML_PARSE_NODICT => 4096, # Do not reuse the context dictionnary
248 XML_PARSE_NSCLEAN => 8192, # remove redundant namespaces declarations
249 XML_PARSE_NOCDATA => 16384, # merge CDATA as text nodes
250 XML_PARSE_NOXINCNODE => 32768, # do not generate XINCLUDE START/END nodes
251 XML_PARSE_COMPACT => 65536, # compact small text nodes; no modification of the tree allowed afterwards
252 # (will possibly crash if you try to modify the tree)
253 XML_PARSE_OLD10 => 131072, # parse using XML-1.0 before update 5
254 XML_PARSE_NOBASEFIX => 262144, # do not fixup XINCLUDE xml#base uris
255 XML_PARSE_HUGE => 524288, # relax any hardcoded limit from the parser
256 XML_PARSE_OLDSAX => 1048576, # parse using SAX2 interface from before 2.7.0
257247µs1465µs};
# spent 465µs making 1 call to XML::LibXML::BEGIN@234
258
25935.15ms277µs
# spent 43µs (9+34) within XML::LibXML::BEGIN@259 which was called: # once (9µs+34µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 259
use constant XML_LIBXML_PARSE_DEFAULTS => ( XML_PARSE_NODICT | XML_PARSE_HUGE | XML_PARSE_DTDLOAD | XML_PARSE_NOENT );
# spent 43µs making 1 call to XML::LibXML::BEGIN@259 # spent 34µs making 1 call to constant::import
260
261# this hash is made global so that applications can add names for new
262# libxml2 parser flags as temporary workaround
263
264117µs%PARSER_FLAGS = (
265 recover => XML_PARSE_RECOVER,
266 expand_entities => XML_PARSE_NOENT,
267 load_ext_dtd => XML_PARSE_DTDLOAD,
268 complete_attributes => XML_PARSE_DTDATTR,
269 validation => XML_PARSE_DTDVALID,
270 suppress_errors => XML_PARSE_NOERROR,
271 suppress_warnings => XML_PARSE_NOWARNING,
272 pedantic_parser => XML_PARSE_PEDANTIC,
273 no_blanks => XML_PARSE_NOBLANKS,
274 expand_xinclude => XML_PARSE_XINCLUDE,
275 xinclude => XML_PARSE_XINCLUDE,
276 no_network => XML_PARSE_NONET,
277 clean_namespaces => XML_PARSE_NSCLEAN,
278 no_cdata => XML_PARSE_NOCDATA,
279 no_xinclude_nodes => XML_PARSE_NOXINCNODE,
280 old10 => XML_PARSE_OLD10,
281 no_base_fix => XML_PARSE_NOBASEFIX,
282 huge => XML_PARSE_HUGE,
283 oldsax => XML_PARSE_OLDSAX,
284);
285
28614µsmy %OUR_FLAGS = (
287 recover => 'XML_LIBXML_RECOVER',
288 line_numbers => 'XML_LIBXML_LINENUMBERS',
289 URI => 'XML_LIBXML_BASE_URI',
290 base_uri => 'XML_LIBXML_BASE_URI',
291 gdome => 'XML_LIBXML_GDOME',
292 ext_ent_handler => 'ext_ent_handler',
293);
294
295sub _parser_options {
296 my ($self, $opts) = @_;
297
298 # currently dictionaries break XML::LibXML memory management
299
300 my $flags;
301
302 if (ref($self)) {
303 $flags = ($self->{XML_LIBXML_PARSER_OPTIONS}||0);
304 } else {
305 $flags = XML_LIBXML_PARSE_DEFAULTS; # safety precaution
306 }
307
308 my ($key, $value);
309 while (($key,$value) = each %$opts) {
310 my $f = $PARSER_FLAGS{ $key };
311 if (defined $f) {
312 if ($value) {
313 $flags |= $f
314 } else {
315 $flags &= ~$f;
316 }
317 } elsif ($key eq 'set_parser_flags') { # this can be used to pass flags XML::LibXML does not yet know about
318 $flags |= $value;
319 } elsif ($key eq 'unset_parser_flags') {
320 $flags &= ~$value;
321 }
322
323 }
324 return $flags;
325}
326
32717µsmy %compatibility_flags = (
328 XML_LIBXML_VALIDATION => 'validation',
329 XML_LIBXML_EXPAND_ENTITIES => 'expand_entities',
330 XML_LIBXML_PEDANTIC => 'pedantic_parser',
331 XML_LIBXML_NONET => 'no_network',
332 XML_LIBXML_EXT_DTD => 'load_ext_dtd',
333 XML_LIBXML_COMPLETE_ATTR => 'complete_attributes',
334 XML_LIBXML_EXPAND_XINCLUDE => 'expand_xinclude',
335 XML_LIBXML_NSCLEAN => 'clean_namespaces',
336 XML_LIBXML_KEEP_BLANKS => 'keep_blanks',
337 XML_LIBXML_LINENUMBERS => 'line_numbers',
338);
339
340#-------------------------------------------------------------------------#
341# parser constructor #
342#-------------------------------------------------------------------------#
343
344
345
# spent 1.07ms within XML::LibXML::new which was called 53 times, avg 20µs/call: # 25 times (687µs+0s) by C4::XSLT::XSLTParse4Display at line 224 of /usr/share/koha/lib/C4/XSLT.pm, avg 27µs/call # 25 times (310µs+0s) by XML::LibXML::SAX::Parser::_parse_string at line 41 of XML/LibXML/SAX/Parser.pm, avg 12µs/call # 3 times (68µs+0s) by XML::LibXML::SAX::Parser::_parse_systemid at line 48 of XML/LibXML/SAX/Parser.pm, avg 23µs/call
sub new {
34653172µs my $class = shift;
34753348µs my $self = bless {
348 }, $class;
3495364µs if (@_) {
350 my %opts = ();
351 if (ref($_[0]) eq 'HASH') {
352 %opts = %{$_[0]};
353 } else {
354 # old interface
355 my %args = @_;
356 %opts=(
357 map {
358 (($compatibility_flags{ $_ }||$_) => $args{ $_ })
359 } keys %args
360 );
361 }
362 # parser flags
363 $opts{no_blanks} = !$opts{keep_blanks} if exists($opts{keep_blanks}) and !exists($opts{no_blanks});
364
365 for (keys %OUR_FLAGS) {
366 $self->{$OUR_FLAGS{$_}} = delete $opts{$_};
367 }
368 $class->load_catalog(delete($opts{catalog})) if $opts{catalog};
369
370 $self->{XML_LIBXML_PARSER_OPTIONS} = XML::LibXML->_parser_options(\%opts);
371
372 # store remaining unknown options directly in $self
373 for (keys %opts) {
374 $self->{$_}=$opts{$_} unless exists $PARSER_FLAGS{$_};
375 }
376 } else {
37753154µs $self->{XML_LIBXML_PARSER_OPTIONS} = XML_LIBXML_PARSE_DEFAULTS;
378 }
3795347µs if ( defined $self->{Handler} ) {
380 $self->set_handler( $self->{Handler} );
381 }
382
3835378µs $self->{_State_} = 0;
38453338µs return $self;
385}
386
387sub _clone {
388 my ($self)=@_;
389 my $new = ref($self)->new({
390 recover => $self->{XML_LIBXML_RECOVER},
391 line_nubers => $self->{XML_LIBXML_LINENUMBERS},
392 base_uri => $self->{XML_LIBXML_BASE_URI},
393 gdome => $self->{XML_LIBXML_GDOME},
394 set_parser_flags => $self->{XML_LIBXML_PARSER_OPTIONS},
395 });
396 return $new;
397}
398
399#-------------------------------------------------------------------------#
400# Threads support methods #
401#-------------------------------------------------------------------------#
402
403# threads doc says CLONE's API may change in future, which would break
404# an XS method prototype
405sub CLONE {
406 if ($XML::LibXML::__threads_shared) {
407 XML::LibXML::_CLONE( $_[0] );
408 }
409}
410
411sub CLONE_SKIP {
412 return $XML::LibXML::__threads_shared ? 0 : 1;
413}
414
415sub __proxy_registry {
416 my ($class)=caller;
417 die "This version of $class uses API of XML::LibXML 1.66 which is not compatible with XML::LibXML $VERSION. Please upgrade $class!\n";
418}
419
420#-------------------------------------------------------------------------#
421# DOM Level 2 document constructor #
422#-------------------------------------------------------------------------#
423
424sub createDocument {
425 my $self = shift;
426 if (!@_ or $_[0] =~ m/^\d\.\d$/) {
427 # for backward compatibility
428 return XML::LibXML::Document->new(@_);
429 }
430 else {
431 # DOM API: createDocument(namespaceURI, qualifiedName, doctype?)
432 my $doc = XML::LibXML::Document-> new;
433 my $el = $doc->createElementNS(shift, shift);
434 $doc->setDocumentElement($el);
435 $doc->setExternalSubset(shift) if @_;
436 return $doc;
437 }
438}
439
440#-------------------------------------------------------------------------#
441# callback functions #
442#-------------------------------------------------------------------------#
443
444sub input_callbacks {
445 my $self = shift;
446 my $icbclass = shift;
447
448 if ( defined $icbclass ) {
449 $self->{XML_LIBXML_CALLBACK_STACK} = $icbclass;
450 }
451 return $self->{XML_LIBXML_CALLBACK_STACK};
452}
453
454
# spent 660µs within XML::LibXML::match_callback which was called 108 times, avg 6µs/call: # 54 times (372µs+0s) by XML::LibXML::_init_callbacks at line 726, avg 7µs/call # 54 times (288µs+0s) by XML::LibXML::_cleanup_callbacks at line 740, avg 5µs/call
sub match_callback {
45510895µs my $self = shift;
456108100µs if ( ref $self ) {
45710858µs if ( scalar @_ ) {
458 $self->{XML_LIBXML_MATCH_CB} = shift;
459 $self->{XML_LIBXML_CALLBACK_STACK} = undef;
460 }
461108565µs return $self->{XML_LIBXML_MATCH_CB};
462 }
463 else {
464 $MatchCB = shift if scalar @_;
465 return $MatchCB;
466 }
467}
468
469
# spent 313µs within XML::LibXML::read_callback which was called 54 times, avg 6µs/call: # 54 times (313µs+0s) by XML::LibXML::_init_callbacks at line 728, avg 6µs/call
sub read_callback {
4705438µs my $self = shift;
4715459µs if ( ref $self ) {
4725433µs if ( scalar @_ ) {
473 $self->{XML_LIBXML_READ_CB} = shift;
474 $self->{XML_LIBXML_CALLBACK_STACK} = undef;
475 }
47654214µs return $self->{XML_LIBXML_READ_CB};
477 }
478 else {
479 $ReadCB = shift if scalar @_;
480 return $ReadCB;
481 }
482}
483
484
# spent 265µs within XML::LibXML::close_callback which was called 54 times, avg 5µs/call: # 54 times (265µs+0s) by XML::LibXML::_init_callbacks at line 729, avg 5µs/call
sub close_callback {
4855439µs my $self = shift;
4865446µs if ( ref $self ) {
4875427µs if ( scalar @_ ) {
488 $self->{XML_LIBXML_CLOSE_CB} = shift;
489 $self->{XML_LIBXML_CALLBACK_STACK} = undef;
490 }
49154280µs return $self->{XML_LIBXML_CLOSE_CB};
492 }
493 else {
494 $CloseCB = shift if scalar @_;
495 return $CloseCB;
496 }
497}
498
499
# spent 364µs within XML::LibXML::open_callback which was called 54 times, avg 7µs/call: # 54 times (364µs+0s) by XML::LibXML::_init_callbacks at line 727, avg 7µs/call
sub open_callback {
5005443µs my $self = shift;
5015491µs if ( ref $self ) {
5025434µs if ( scalar @_ ) {
503 $self->{XML_LIBXML_OPEN_CB} = shift;
504 $self->{XML_LIBXML_CALLBACK_STACK} = undef;
505 }
50654306µs return $self->{XML_LIBXML_OPEN_CB};
507 }
508 else {
509 $OpenCB = shift if scalar @_;
510 return $OpenCB;
511 }
512}
513
514sub callbacks {
515 my $self = shift;
516 if ( ref $self ) {
517 if (@_) {
518 my ($match, $open, $read, $close) = @_;
519 @{$self}{qw(XML_LIBXML_MATCH_CB XML_LIBXML_OPEN_CB XML_LIBXML_READ_CB XML_LIBXML_CLOSE_CB)} = ($match, $open, $read, $close);
520 $self->{XML_LIBXML_CALLBACK_STACK} = undef;
521 }
522 else {
523 return @{$self}{qw(XML_LIBXML_MATCH_CB XML_LIBXML_OPEN_CB XML_LIBXML_READ_CB XML_LIBXML_CLOSE_CB)};
524 }
525 }
526 else {
527 if (@_) {
528 ( $MatchCB, $OpenCB, $ReadCB, $CloseCB ) = @_;
529 }
530 else {
531 return ( $MatchCB, $OpenCB, $ReadCB, $CloseCB );
532 }
533 }
534}
535
536#-------------------------------------------------------------------------#
537# internal member variable manipulation #
538#-------------------------------------------------------------------------#
539
# spent 604µs within XML::LibXML::__parser_option which was called 79 times, avg 8µs/call: # 54 times (352µs+0s) by XML::LibXML::expand_xinclude at line 657, avg 7µs/call # 25 times (252µs+0s) by XML::LibXML::recover at line 599, avg 10µs/call
sub __parser_option {
5407988µs my ($self, $opt) = @_;
54179106µs if (@_>2) {
5422513µs if ($_[2]) {
543 $self->{XML_LIBXML_PARSER_OPTIONS} |= $opt;
544 return 1;
545 } else {
5462563µs $self->{XML_LIBXML_PARSER_OPTIONS} &= ~$opt;
54725131µs return 0;
548 }
549 } else {
55054363µs return ($self->{XML_LIBXML_PARSER_OPTIONS} & $opt) ? 1 : 0;
551 }
552}
553
554sub option_exists {
555 my ($self,$name)=@_;
556 return ($PARSER_FLAGS{$name} || $OUR_FLAGS{$name}) ? 1 : 0;
557}
558sub get_option {
559 my ($self,$name)=@_;
560 my $flag = $OUR_FLAGS{$name};
561 return $self->{$flag} if $flag;
562 $flag = $PARSER_FLAGS{$name};
563 return $self->__parser_option($flag) if $flag;
564 warn "XML::LibXML::get_option: unknown parser option $name\n";
565 return undef;
566}
567sub set_option {
568 my ($self,$name,$value)=@_;
569 my $flag = $OUR_FLAGS{$name};
570 return ($self->{$flag}=$value) if $flag;
571 $flag = $PARSER_FLAGS{$name};
572 return $self->__parser_option($flag,$value) if $flag;
573 warn "XML::LibXML::get_option: unknown parser option $name\n";
574 return undef;
575}
576sub set_options {
577 my $self=shift;
578 my $opts;
579 if (@_==1 and ref($_[0]) eq 'HASH') {
580 $opts = $_[0];
581 } elsif (@_ % 2 == 0) {
582 $opts={@_};
583 } else {
584 croak("Odd number of elements passed to set_options");
585 }
586 $self->set_option($_=>$opts->{$_}) foreach keys %$opts;
587 return;
588}
589
590sub validation {
591 my $self = shift;
592 return $self->__parser_option(XML_PARSE_DTDVALID,@_);
593}
594
595
# spent 678µs (426+252) within XML::LibXML::recover which was called 50 times, avg 14µs/call: # 25 times (351µs+252µs) by XML::LibXML::recover_silently at line 607, avg 24µs/call # 25 times (75µs+0s) by XML::LibXML::recover_silently at line 608, avg 3µs/call
sub recover {
5965033µs my $self = shift;
5975039µs if (scalar @_) {
5982566µs $self->{XML_LIBXML_RECOVER} = $_[0];
59925120µs25252µs $self->__parser_option(XML_PARSE_RECOVER,@_);
# spent 252µs making 25 calls to XML::LibXML::__parser_option, avg 10µs/call
600 }
60150184µs return $self->{XML_LIBXML_RECOVER};
602}
603
604
# spent 1.05ms (369µs+678µs) within XML::LibXML::recover_silently which was called 25 times, avg 42µs/call: # 25 times (369µs+678µs) by C4::XSLT::XSLTParse4Display at line 226 of /usr/share/koha/lib/C4/XSLT.pm, avg 42µs/call
sub recover_silently {
6052523µs my $self = shift;
6062519µs my $arg = shift;
60725119µs25604µs (($arg == 1) ? $self->recover(2) : $self->recover($arg)) if defined($arg);
# spent 604µs making 25 calls to XML::LibXML::recover, avg 24µs/call
60825159µs2575µs return (($self->recover()||0) == 2) ? 1 : 0;
# spent 75µs making 25 calls to XML::LibXML::recover, avg 3µs/call
609}
610
611sub expand_entities {
612 my $self = shift;
613 if (scalar(@_) and $_[0]) {
614 return $self->__parser_option(XML_PARSE_NOENT | XML_PARSE_DTDLOAD,1);
615 }
616 return $self->__parser_option(XML_PARSE_NOENT,@_);
617}
618
619sub keep_blanks {
620 my $self = shift;
621 my @args; # we have to negate the argument and return negated value, since
622 # the actual flag is no_blanks
623 if (scalar @_) {
624 @args=($_[0] ? 0 : 1);
625 }
626 return $self->__parser_option(XML_PARSE_NOBLANKS,@args) ? 0 : 1;
627}
628
629sub pedantic_parser {
630 my $self = shift;
631 return $self->__parser_option(XML_PARSE_PEDANTIC,@_);
632}
633
634sub line_numbers {
635 my $self = shift;
636 $self->{XML_LIBXML_LINENUMBERS} = shift if scalar @_;
637 return $self->{XML_LIBXML_LINENUMBERS};
638}
639
640sub no_network {
641 my $self = shift;
642 return $self->__parser_option(XML_PARSE_NONET,@_);
643}
644
645sub load_ext_dtd {
646 my $self = shift;
647 return $self->__parser_option(XML_PARSE_DTDLOAD,@_);
648}
649
650sub complete_attributes {
651 my $self = shift;
652 return $self->__parser_option(XML_PARSE_DTDATTR,@_);
653}
654
655
# spent 863µs (512+352) within XML::LibXML::expand_xinclude which was called 54 times, avg 16µs/call: # 54 times (512µs+352µs) by XML::LibXML::_auto_expand at line 704, avg 16µs/call
sub expand_xinclude {
6565456µs my $self = shift;
65754427µs54352µs return $self->__parser_option(XML_PARSE_XINCLUDE,@_);
# spent 352µs making 54 calls to XML::LibXML::__parser_option, avg 7µs/call
658}
659
660sub base_uri {
661 my $self = shift;
662 $self->{XML_LIBXML_BASE_URI} = shift if scalar @_;
663 return $self->{XML_LIBXML_BASE_URI};
664}
665
666sub gdome_dom {
667 my $self = shift;
668 $self->{XML_LIBXML_GDOME} = shift if scalar @_;
669 return $self->{XML_LIBXML_GDOME};
670}
671
672sub clean_namespaces {
673 my $self = shift;
674 return $self->__parser_option(XML_PARSE_NSCLEAN,@_);
675}
676
677#-------------------------------------------------------------------------#
678# set the optional SAX(2) handler #
679#-------------------------------------------------------------------------#
680sub set_handler {
681 my $self = shift;
682 if ( defined $_[0] ) {
683 $self->{HANDLER} = $_[0];
684
685 $self->{SAX_ELSTACK} = [];
686 $self->{SAX} = {State => 0};
687 }
688 else {
689 # undef SAX handling
690 $self->{SAX_ELSTACK} = [];
691 delete $self->{HANDLER};
692 delete $self->{SAX};
693 }
694}
695
696#-------------------------------------------------------------------------#
697# helper functions #
698#-------------------------------------------------------------------------#
699
# spent 1.61ms (745µs+863µs) within XML::LibXML::_auto_expand which was called 54 times, avg 30µs/call: # 50 times (706µs+811µs) by XML::LibXML::parse_string at line 856, avg 30µs/call # 4 times (39µs+52µs) by XML::LibXML::parse_file at line 932, avg 23µs/call
sub _auto_expand {
70054151µs my ( $self, $result, $uri ) = @_;
701
7025434µs $result->setBaseURI( $uri ) if defined $uri;
703
70454263µs54863µs if ( $self->expand_xinclude ) {
# spent 863µs making 54 calls to XML::LibXML::expand_xinclude, avg 16µs/call
705 $self->{_State_} = 1;
706 eval { $self->processXIncludes($result); };
707 my $err = $@;
708 $self->{_State_} = 0;
709 if ($err) {
710 $self->_cleanup_callbacks();
711 $result = undef;
712 croak $err;
713 }
714 }
71554246µs return $result;
716}
717
718
# spent 5.70ms (2.60+3.11) within XML::LibXML::_init_callbacks which was called 54 times, avg 106µs/call: # 50 times (2.42ms+2.90ms) by XML::LibXML::parse_string at line 831, avg 106µs/call # 4 times (172µs+210µs) by XML::LibXML::parse_file at line 909, avg 95µs/call
sub _init_callbacks {
7195444µs my $self = shift;
7205482µs my $icb = $self->{XML_LIBXML_CALLBACK_STACK};
7215455µs unless ( defined $icb ) {
72253484µs53586µs $self->{XML_LIBXML_CALLBACK_STACK} = XML::LibXML::InputCallback->new();
# spent 586µs making 53 calls to XML::LibXML::InputCallback::new, avg 11µs/call
7235367µs $icb = $self->{XML_LIBXML_CALLBACK_STACK};
724 }
725
72654267µs54372µs my $mcb = $self->match_callback();
# spent 372µs making 54 calls to XML::LibXML::match_callback, avg 7µs/call
72754267µs54364µs my $ocb = $self->open_callback();
# spent 364µs making 54 calls to XML::LibXML::open_callback, avg 7µs/call
72854227µs54313µs my $rcb = $self->read_callback();
# spent 313µs making 54 calls to XML::LibXML::read_callback, avg 6µs/call
72954184µs54265µs my $ccb = $self->close_callback();
# spent 265µs making 54 calls to XML::LibXML::close_callback, avg 5µs/call
730
7315444µs if ( defined $mcb and defined $ocb and defined $rcb and defined $ccb ) {
732 $icb->register_callbacks( [$mcb, $ocb, $rcb, $ccb] );
733 }
73454442µs541.21ms $icb->init_callbacks();
# spent 1.21ms making 54 calls to XML::LibXML::InputCallback::init_callbacks, avg 22µs/call
735}
736
737
# spent 2.68ms (1.22+1.46) within XML::LibXML::_cleanup_callbacks which was called 54 times, avg 50µs/call: # 50 times (1.12ms+1.35ms) by XML::LibXML::parse_string at line 858, avg 49µs/call # 4 times (103µs+109µs) by XML::LibXML::parse_file at line 934, avg 53µs/call
sub _cleanup_callbacks {
7385441µs my $self = shift;
73954245µs54735µs $self->{XML_LIBXML_CALLBACK_STACK}->cleanup_callbacks();
# spent 735µs making 54 calls to XML::LibXML::InputCallback::cleanup_callbacks, avg 14µs/call
74054225µs54288µs my $mcb = $self->match_callback();
# spent 288µs making 54 calls to XML::LibXML::match_callback, avg 5µs/call
74154468µs54437µs $self->{XML_LIBXML_CALLBACK_STACK}->unregister_callbacks( [$mcb] );
# spent 437µs making 54 calls to XML::LibXML::InputCallback::unregister_callbacks, avg 8µs/call
742}
743
744sub __read {
745 read($_[0], $_[1], $_[2]);
746}
747
748sub __write {
749 if ( ref( $_[0] ) ) {
750 $_[0]->write( $_[1], $_[2] );
751 }
752 else {
753 $_[0]->write( $_[1] );
754 }
755}
756
757sub load_xml {
758 my ($class_or_self) = shift;
759 my %args = map { ref($_) eq 'HASH' ? (%$_) : $_ } @_;
760 my $URI = delete($args{URI});
761 $URI = "$URI" if defined $URI; # stringify in case it is an URI object
762 my $parser;
763 if (ref($class_or_self)) {
764 $parser = $class_or_self->_clone();
765 $parser->{XML_LIBXML_PARSER_OPTIONS} = $parser->_parser_options(\%args);
766 } else {
767 $parser = $class_or_self->new(\%args);
768 }
769 my $dom;
770 if ( defined $args{location} ) {
771 $dom = $parser->parse_file( "$args{location}" );
772 }
773 elsif ( defined $args{string} ) {
774 $dom = $parser->parse_string( $args{string}, $URI );
775 }
776 elsif ( defined $args{IO} ) {
777 $dom = $parser->parse_fh( $args{IO}, $URI );
778 }
779 else {
780 croak("XML::LibXML->load: specify location, string, or IO");
781 }
782 return $dom;
783}
784
785sub load_html {
786 my ($class_or_self) = shift;
787 my %args = map { ref($_) eq 'HASH' ? (%$_) : $_ } @_;
788 my $URI = delete($args{URI});
789 $URI = "$URI" if defined $URI; # stringify in case it is an URI object
790 my $parser;
791 if (ref($class_or_self)) {
792 $parser = $class_or_self->_clone();
793 } else {
794 $parser = $class_or_self->new();
795 }
796 my $dom;
797 if ( defined $args{location} ) {
798 $dom = $parser->parse_html_file( "$args{location}", \%args );
799 }
800 elsif ( defined $args{string} ) {
801 $dom = $parser->parse_html_string( $args{string}, \%args );
802 }
803 elsif ( defined $args{IO} ) {
804 $dom = $parser->parse_html_fh( $args{IO}, \%args );
805 }
806 else {
807 croak("XML::LibXML->load: specify location, string, or IO");
808 }
809 return $dom;
810}
811
812#-------------------------------------------------------------------------#
813# parsing functions #
814#-------------------------------------------------------------------------#
815# all parsing functions handle normal as SAX parsing at the same time.
816# note that SAX parsing is handled incomplete! use XML::LibXML::SAX for
817# complete parsing sequences
818#-------------------------------------------------------------------------#
819
# spent 24.6ms (2.53+22.1) within XML::LibXML::parse_string which was called 50 times, avg 492µs/call: # 25 times (1.40ms+12.3ms) by C4::XSLT::XSLTParse4Display at line 227 of /usr/share/koha/lib/C4/XSLT.pm, avg 547µs/call # 25 times (1.13ms+9.78ms) by XML::LibXML::SAX::Parser::_parse_string at line 42 of XML/LibXML/SAX/Parser.pm, avg 436µs/call
sub parse_string {
8205038µs my $self = shift;
8215054µs croak("parse_string is not a class method! Create a parser object with XML::LibXML->new first!") unless ref $self;
8225062µs croak("parse already in progress") if $self->{_State_};
823
82450246µs unless ( defined $_[0] and length $_[0] ) {
825 croak("Empty String");
826 }
827
8285049µs $self->{_State_} = 1;
8295021µs my $result;
830
83150253µs505.32ms $self->_init_callbacks();
# spent 5.32ms making 50 calls to XML::LibXML::_init_callbacks, avg 106µs/call
832
83350116µs if ( defined $self->{SAX} ) {
834 my $string = shift;
835 $self->{SAX_ELSTACK} = [];
836 eval { $result = $self->_parse_sax_string($string); };
837 my $err = $@;
838 $self->{_State_} = 0;
839 if ($err) {
840 chomp $err unless ref $err;
841 $self->_cleanup_callbacks();
842 croak $err;
843 }
844 }
845 else {
84610013.4ms5012.8ms eval { $result = $self->_parse_string( @_ ); };
# spent 12.8ms making 50 calls to XML::LibXML::_parse_string, avg 255µs/call
847
8485051µs my $err = $@;
8495080µs $self->{_State_} = 0;
8505031µs if ($err) {
851 chomp $err unless ref $err;
852 $self->_cleanup_callbacks();
853 croak $err;
854 }
855
85650388µs501.52ms $result = $self->_auto_expand( $result, $self->{XML_LIBXML_BASE_URI} );
# spent 1.52ms making 50 calls to XML::LibXML::_auto_expand, avg 30µs/call
857 }
85850245µs502.47ms $self->_cleanup_callbacks();
# spent 2.47ms making 50 calls to XML::LibXML::_cleanup_callbacks, avg 49µs/call
859
86050210µs return $result;
861}
862
863sub parse_fh {
864 my $self = shift;
865 croak("parse_fh is not a class method! Create a parser object with XML::LibXML->new first!") unless ref $self;
866 croak("parse already in progress") if $self->{_State_};
867 $self->{_State_} = 1;
868 my $result;
869
870 $self->_init_callbacks();
871
872 if ( defined $self->{SAX} ) {
873 $self->{SAX_ELSTACK} = [];
874 eval { $self->_parse_sax_fh( @_ ); };
875 my $err = $@;
876 $self->{_State_} = 0;
877 if ($err) {
878 chomp $err unless ref $err;
879 $self->_cleanup_callbacks();
880 croak $err;
881 }
882 }
883 else {
884 eval { $result = $self->_parse_fh( @_ ); };
885 my $err = $@;
886 $self->{_State_} = 0;
887 if ($err) {
888 chomp $err unless ref $err;
889 $self->_cleanup_callbacks();
890 croak $err;
891 }
892
893 $result = $self->_auto_expand( $result, $self->{XML_LIBXML_BASE_URI} );
894 }
895
896 $self->_cleanup_callbacks();
897
898 return $result;
899}
900
901
# spent 3.67ms (149µs+3.52) within XML::LibXML::parse_file which was called 4 times, avg 917µs/call: # 3 times (118µs+2.02ms) by XML::LibXML::SAX::Parser::_parse_systemid at line 49 of XML/LibXML/SAX/Parser.pm, avg 711µs/call # once (31µs+1.50ms) by C4::XSLT::XSLTParse4Display at line 236 of /usr/share/koha/lib/C4/XSLT.pm
sub parse_file {
90243µs my $self = shift;
90345µs croak("parse_file is not a class method! Create a parser object with XML::LibXML->new first!") unless ref $self;
90445µs croak("parse already in progress") if $self->{_State_};
905
90643µs $self->{_State_} = 1;
90741µs my $result;
908
909417µs4382µs $self->_init_callbacks();
# spent 382µs making 4 calls to XML::LibXML::_init_callbacks, avg 95µs/call
910
91145µs if ( defined $self->{SAX} ) {
912 $self->{SAX_ELSTACK} = [];
913 eval { $self->_parse_sax_file( @_ ); };
914 my $err = $@;
915 $self->{_State_} = 0;
916 if ($err) {
917 chomp $err unless ref $err;
918 $self->_cleanup_callbacks();
919 croak $err;
920 }
921 }
922 else {
92382.84ms82.87ms eval { $result = $self->_parse_file(@_); };
# spent 2.83ms making 4 calls to XML::LibXML::_parse_file, avg 709µs/call # spent 33µs making 4 calls to XML::LibXML::InputCallback::_callback_match, avg 8µs/call
92443µs my $err = $@;
92545µs $self->{_State_} = 0;
92642µs if ($err) {
927 chomp $err unless ref $err;
928 $self->_cleanup_callbacks();
929 croak $err;
930 }
931
932420µs491µs $result = $self->_auto_expand( $result );
# spent 91µs making 4 calls to XML::LibXML::_auto_expand, avg 23µs/call
933 }
934417µs4213µs $self->_cleanup_callbacks();
# spent 213µs making 4 calls to XML::LibXML::_cleanup_callbacks, avg 53µs/call
935
936419µs return $result;
937}
938
939sub parse_xml_chunk {
940 my $self = shift;
941 # max 2 parameter:
942 # 1: the chunk
943 # 2: the encoding of the string
944 croak("parse_xml_chunk is not a class method! Create a parser object with XML::LibXML->new first!") unless ref $self;
945 croak("parse already in progress") if $self->{_State_}; my $result;
946
947 unless ( defined $_[0] and length $_[0] ) {
948 croak("Empty String");
949 }
950
951 $self->{_State_} = 1;
952
953 $self->_init_callbacks();
954
955 if ( defined $self->{SAX} ) {
956 eval {
957 $self->_parse_sax_xml_chunk( @_ );
958
959 # this is required for XML::GenericChunk.
960 # in normal case is_filter is not defined, an thus the parsing
961 # will be terminated. in case of a SAX filter the parsing is not
962 # finished at that state. therefore we must not reset the parsing
963 unless ( $self->{IS_FILTER} ) {
964 $result = $self->{HANDLER}->end_document();
965 }
966 };
967 }
968 else {
969 eval { $result = $self->_parse_xml_chunk( @_ ); };
970 }
971
972 $self->_cleanup_callbacks();
973
974 my $err = $@;
975 $self->{_State_} = 0;
976 if ($err) {
977 chomp $err unless ref $err;
978 croak $err;
979 }
980
981 return $result;
982}
983
984sub parse_balanced_chunk {
985 my $self = shift;
986 $self->_init_callbacks();
987 my $rv;
988 eval {
989 $rv = $self->parse_xml_chunk( @_ );
990 };
991 my $err = $@;
992 $self->_cleanup_callbacks();
993 if ( $err ) {
994 chomp $err unless ref $err;
995 croak $err;
996 }
997 return $rv
998}
999
1000# java style
1001sub processXIncludes {
1002 my $self = shift;
1003 my $doc = shift;
1004 my $opts = shift;
1005 my $options = $self->_parser_options($opts);
1006 if ( $self->{_State_} != 1 ) {
1007 $self->_init_callbacks();
1008 }
1009 my $rv;
1010 eval {
1011 $rv = $self->_processXIncludes($doc || " ", $options);
1012 };
1013 my $err = $@;
1014 if ( $self->{_State_} != 1 ) {
1015 $self->_cleanup_callbacks();
1016 }
1017
1018 if ( $err ) {
1019 chomp $err unless ref $err;
1020 croak $err;
1021 }
1022 return $rv;
1023}
1024
1025# perl style
1026sub process_xincludes {
1027 my $self = shift;
1028 my $doc = shift;
1029 my $opts = shift;
1030 my $options = $self->_parser_options($opts);
1031
1032 my $rv;
1033 $self->_init_callbacks();
1034 eval {
1035 $rv = $self->_processXIncludes($doc || " ", $options);
1036 };
1037 my $err = $@;
1038 $self->_cleanup_callbacks();
1039 if ( $err ) {
1040 chomp $err unless ref $err;
1041 croak $@;
1042 }
1043 return $rv;
1044}
1045
1046#-------------------------------------------------------------------------#
1047# HTML parsing functions #
1048#-------------------------------------------------------------------------#
1049
1050sub _html_options {
1051 my ($self,$opts)=@_;
1052 $opts = {} unless ref $opts;
1053 # return (undef,undef) unless ref $opts;
1054 my $flags = 0;
1055 $flags |= 1 if exists $opts->{recover} ? $opts->{recover} : $self->recover;
1056 $flags |= 32 if $opts->{suppress_errors};
1057 $flags |= 64 if $opts->{suppress_warnings};
1058 $flags |= 128 if exists $opts->{pedantic_parser} ? $opts->{pedantic_parser} : $self->pedantic_parser;
1059 $flags |= 256 if exists $opts->{no_blanks} ? $opts->{no_blanks} : !$self->keep_blanks;
1060 $flags |= 2048 if exists $opts->{no_network} ? $opts->{no_network} : !$self->no_network;
1061 $flags |= 16384 if $opts->{no_cdata};
1062 $flags |= 65536 if $opts->{compact}; # compact small text nodes; no modification
1063 # of the tree allowed afterwards
1064 # (WILL possibly CRASH IF YOU try to MODIFY THE TREE)
1065 $flags |= 524288 if $opts->{huge}; # relax any hardcoded limit from the parser
1066 $flags |= 1048576 if $opts->{oldsax}; # parse using SAX2 interface from before 2.7.0
1067
1068 return ($opts->{URI},$opts->{encoding},$flags);
1069}
1070
1071sub parse_html_string {
1072 my ($self,$str,$opts) = @_;
1073 croak("parse_html_string is not a class method! Create a parser object with XML::LibXML->new first!") unless ref $self;
1074 croak("parse already in progress") if $self->{_State_};
1075
1076 unless ( defined $str and length $str ) {
1077 croak("Empty String");
1078 }
1079 $self->{_State_} = 1;
1080 my $result;
1081
1082 $self->_init_callbacks();
1083 eval {
1084 $result = $self->_parse_html_string( $str,
1085 $self->_html_options($opts)
1086 );
1087 };
1088 my $err = $@;
1089 $self->{_State_} = 0;
1090 if ($err) {
1091 chomp $err unless ref $err;
1092 $self->_cleanup_callbacks();
1093 croak $err;
1094 }
1095
1096 $self->_cleanup_callbacks();
1097
1098 return $result;
1099}
1100
1101sub parse_html_file {
1102 my ($self,$file,$opts) = @_;
1103 croak("parse_html_file is not a class method! Create a parser object with XML::LibXML->new first!") unless ref $self;
1104 croak("parse already in progress") if $self->{_State_};
1105 $self->{_State_} = 1;
1106 my $result;
1107
1108 $self->_init_callbacks();
1109 eval { $result = $self->_parse_html_file($file,
1110 $self->_html_options($opts)
1111 ); };
1112 my $err = $@;
1113 $self->{_State_} = 0;
1114 if ($err) {
1115 chomp $err unless ref $err;
1116 $self->_cleanup_callbacks();
1117 croak $err;
1118 }
1119
1120 $self->_cleanup_callbacks();
1121
1122 return $result;
1123}
1124
1125sub parse_html_fh {
1126 my ($self,$fh,$opts) = @_;
1127 croak("parse_html_fh is not a class method! Create a parser object with XML::LibXML->new first!") unless ref $self;
1128 croak("parse already in progress") if $self->{_State_};
1129 $self->{_State_} = 1;
1130
1131 my $result;
1132 $self->_init_callbacks();
1133 eval { $result = $self->_parse_html_fh( $fh,
1134 $self->_html_options($opts)
1135 ); };
1136 my $err = $@;
1137 $self->{_State_} = 0;
1138 if ($err) {
1139 chomp $err unless ref $err;
1140 $self->_cleanup_callbacks();
1141 croak $err;
1142 }
1143 $self->_cleanup_callbacks();
1144
1145 return $result;
1146}
1147
1148#-------------------------------------------------------------------------#
1149# push parser interface #
1150#-------------------------------------------------------------------------#
1151sub init_push {
1152 my $self = shift;
1153
1154 if ( defined $self->{CONTEXT} ) {
1155 delete $self->{CONTEXT};
1156 }
1157
1158 if ( defined $self->{SAX} ) {
1159 $self->{CONTEXT} = $self->_start_push(1);
1160 }
1161 else {
1162 $self->{CONTEXT} = $self->_start_push(0);
1163 }
1164}
1165
1166sub push {
1167 my $self = shift;
1168
1169 $self->_init_callbacks();
1170
1171 if ( not defined $self->{CONTEXT} ) {
1172 $self->init_push();
1173 }
1174
1175 eval {
1176 foreach ( @_ ) {
1177 $self->_push( $self->{CONTEXT}, $_ );
1178 }
1179 };
1180 my $err = $@;
1181 $self->_cleanup_callbacks();
1182 if ( $err ) {
1183 chomp $err unless ref $err;
1184 croak $err;
1185 }
1186}
1187
1188# this function should be promoted!
1189# the reason is because libxml2 uses xmlParseChunk() for this purpose!
1190sub parse_chunk {
1191 my $self = shift;
1192 my $chunk = shift;
1193 my $terminate = shift;
1194
1195 if ( not defined $self->{CONTEXT} ) {
1196 $self->init_push();
1197 }
1198
1199 if ( defined $chunk and length $chunk ) {
1200 $self->_push( $self->{CONTEXT}, $chunk );
1201 }
1202
1203 if ( $terminate ) {
1204 return $self->finish_push();
1205 }
1206}
1207
1208
1209sub finish_push {
1210 my $self = shift;
1211 my $restore = shift || 0;
1212 return undef unless defined $self->{CONTEXT};
1213
1214 my $retval;
1215
1216 if ( defined $self->{SAX} ) {
1217 eval {
1218 $self->_end_sax_push( $self->{CONTEXT} );
1219 $retval = $self->{HANDLER}->end_document( {} );
1220 };
1221 }
1222 else {
1223 eval { $retval = $self->_end_push( $self->{CONTEXT}, $restore ); };
1224 }
1225 my $err = $@;
1226 delete $self->{CONTEXT};
1227 if ( $err ) {
1228 chomp $err unless ref $err;
1229 croak( $err );
1230 }
1231 return $retval;
1232}
1233
12341200ns1;
1235
1236#-------------------------------------------------------------------------#
1237# XML::LibXML::Node Interface #
1238#-------------------------------------------------------------------------#
1239package XML::LibXML::Node;
1240
1241sub CLONE_SKIP {
1242 return $XML::LibXML::__threads_shared ? 0 : 1;
1243}
1244
1245sub isSupported {
1246 my $self = shift;
1247 my $feature = shift;
1248 return $self->can($feature) ? 1 : 0;
1249}
1250
1251sub getChildNodes { my $self = shift; return $self->childNodes(); }
1252
1253
# spent 23.4ms (12.7+10.6) within XML::LibXML::Node::childNodes which was called 1647 times, avg 14µs/call: # 1619 times (12.4ms+10.4ms) by XML::LibXML::SAX::Parser::process_element at line 243 of XML/LibXML/SAX/Parser.pm, avg 14µs/call # 28 times (303µs+199µs) by XML::LibXML::SAX::Parser::process_node at line 102 of XML/LibXML/SAX/Parser.pm, avg 18µs/call
sub childNodes {
12541647889µs my $self = shift;
1255164717.6ms164710.6ms my @children = $self->_childNodes(0);
# spent 10.6ms making 1647 calls to XML::LibXML::Node::_childNodes, avg 6µs/call
125616475.67ms return wantarray ? @children : XML::LibXML::NodeList->new_from_ref(\@children , 1);
1257}
1258
1259sub nonBlankChildNodes {
1260 my $self = shift;
1261 my @children = $self->_childNodes(1);
1262 return wantarray ? @children : XML::LibXML::NodeList->new_from_ref(\@children , 1);
1263}
1264
1265
# spent 18.3ms (10.6+7.72) within XML::LibXML::Node::attributes which was called 1619 times, avg 11µs/call: # 1619 times (10.6ms+7.72ms) by XML::LibXML::SAX::Parser::process_element at line 166 of XML/LibXML/SAX/Parser.pm, avg 11µs/call
sub attributes {
12661619861µs my $self = shift;
1267161913.5ms16197.72ms my @attr = $self->_attributes();
# spent 7.72ms making 1619 calls to XML::LibXML::Node::_attributes, avg 5µs/call
126816195.17ms return wantarray ? @attr : XML::LibXML::NamedNodeMap->new( @attr );
1269}
1270
1271
1272sub findnodes {
1273 my ($node, $xpath) = @_;
1274 my @nodes = $node->_findnodes($xpath);
1275 if (wantarray) {
1276 return @nodes;
1277 }
1278 else {
1279 return XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1280 }
1281}
1282
1283sub exists {
1284 my ($node, $xpath) = @_;
1285 my (undef, $value) = $node->_find($xpath,1);
1286 return $value;
1287}
1288
1289sub findvalue {
1290 my ($node, $xpath) = @_;
1291 my $res;
1292 $res = $node->find($xpath);
1293 return $res->to_literal->value;
1294}
1295
1296sub findbool {
1297 my ($node, $xpath) = @_;
1298 my ($type, @params) = $node->_find($xpath,1);
1299 if ($type) {
1300 return $type->new(@params);
1301 }
1302 return undef;
1303}
1304
1305sub find {
1306 my ($node, $xpath) = @_;
1307 my ($type, @params) = $node->_find($xpath,0);
1308 if ($type) {
1309 return $type->new(@params);
1310 }
1311 return undef;
1312}
1313
1314sub setOwnerDocument {
1315 my ( $self, $doc ) = @_;
1316 $doc->adoptNode( $self );
1317}
1318
1319sub toStringC14N {
1320 my ($self, $comments, $xpath, $xpc) = @_;
1321 return $self->_toStringC14N( $comments || 0,
1322 (defined $xpath ? $xpath : undef),
1323 0,
1324 undef,
1325 (defined $xpc ? $xpc : undef)
1326 );
1327}
1328sub toStringEC14N {
1329 my ($self, $comments, $xpath, $xpc, $inc_prefix_list) = @_;
1330 unless (UNIVERSAL::isa($xpc,'XML::LibXML::XPathContext')) {
1331 if ($inc_prefix_list) {
1332 croak("toStringEC14N: 3rd argument is not an XML::LibXML::XPathContext");
1333 } else {
1334 $inc_prefix_list=$xpc;
1335 $xpc=undef;
1336 }
1337 }
1338 if (defined($inc_prefix_list) and !UNIVERSAL::isa($inc_prefix_list,'ARRAY')) {
1339 croak("toStringEC14N: inclusive_prefix_list must be undefined or ARRAY");
1340 }
1341 return $self->_toStringC14N( $comments || 0,
1342 (defined $xpath ? $xpath : undef),
1343 1,
1344 (defined $inc_prefix_list ? $inc_prefix_list : undef),
1345 (defined $xpc ? $xpc : undef)
1346 );
1347}
1348
134913µs*serialize_c14n = \&toStringC14N;
13501800ns*serialize_exc_c14n = \&toStringEC14N;
1351
13521200ns1;
1353
1354#-------------------------------------------------------------------------#
1355# XML::LibXML::Document Interface #
1356#-------------------------------------------------------------------------#
1357package XML::LibXML::Document;
1358
13593436µs2158µs
# spent 93µs (28+65) within XML::LibXML::Document::BEGIN@1359 which was called: # once (28µs+65µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1359
use vars qw(@ISA);
# spent 93µs making 1 call to XML::LibXML::Document::BEGIN@1359 # spent 65µs making 1 call to vars::import
1360117µs@ISA = ('XML::LibXML::Node');
1361
1362sub actualEncoding {
1363 my $doc = shift;
1364 my $enc = $doc->encoding;
1365 return (defined $enc and length $enc) ? $enc : 'UTF-8';
1366}
1367
1368sub setDocumentElement {
1369 my $doc = shift;
1370 my $element = shift;
1371
1372 my $oldelem = $doc->documentElement;
1373 if ( defined $oldelem ) {
1374 $doc->removeChild($oldelem);
1375 }
1376
1377 $doc->_setDocumentElement($element);
1378}
1379
1380sub toString {
1381 my $self = shift;
1382 my $flag = shift;
1383
1384 my $retval = "";
1385
1386 if ( defined $XML::LibXML::skipXMLDeclaration
1387 and $XML::LibXML::skipXMLDeclaration == 1 ) {
1388 foreach ( $self->childNodes ){
1389 next if $_->nodeType == XML::LibXML::XML_DTD_NODE()
1390 and $XML::LibXML::skipDTD;
1391 $retval .= $_->toString;
1392 }
1393 }
1394 else {
1395 $flag ||= 0 unless defined $flag;
1396 $retval = $self->_toString($flag);
1397 }
1398
1399 return $retval;
1400}
1401
1402sub serialize {
1403 my $self = shift;
1404 return $self->toString( @_ );
1405}
1406
1407#-------------------------------------------------------------------------#
1408# bad style xinclude processing #
1409#-------------------------------------------------------------------------#
1410sub process_xinclude {
1411 my $self = shift;
1412 my $opts = shift;
1413 XML::LibXML->new->processXIncludes( $self, $opts );
1414}
1415
1416sub insertProcessingInstruction {
1417 my $self = shift;
1418 my $target = shift;
1419 my $data = shift;
1420
1421 my $pi = $self->createPI( $target, $data );
1422 my $root = $self->documentElement;
1423
1424 if ( defined $root ) {
1425 # this is actually not correct, but i guess it's what the user
1426 # intends
1427 $self->insertBefore( $pi, $root );
1428 }
1429 else {
1430 # if no documentElement was found we just append the PI
1431 $self->appendChild( $pi );
1432 }
1433}
1434
1435sub insertPI {
1436 my $self = shift;
1437 $self->insertProcessingInstruction( @_ );
1438}
1439
1440#-------------------------------------------------------------------------#
1441# DOM L3 Document functions.
1442# added after robins implicit feature requst
1443#-------------------------------------------------------------------------#
14441900ns*getElementsByTagName = \&XML::LibXML::Element::getElementsByTagName;
14451600ns*getElementsByTagNameNS = \&XML::LibXML::Element::getElementsByTagNameNS;
14461500ns*getElementsByLocalName = \&XML::LibXML::Element::getElementsByLocalName;
1447
14481200ns1;
1449
1450#-------------------------------------------------------------------------#
1451# XML::LibXML::DocumentFragment Interface #
1452#-------------------------------------------------------------------------#
1453package XML::LibXML::DocumentFragment;
1454
14553118µs277µs
# spent 44µs (12+32) within XML::LibXML::DocumentFragment::BEGIN@1455 which was called: # once (12µs+32µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1455
use vars qw(@ISA);
# spent 44µs making 1 call to XML::LibXML::DocumentFragment::BEGIN@1455 # spent 33µs making 1 call to vars::import
145617µs@ISA = ('XML::LibXML::Node');
1457
1458sub toString {
1459 my $self = shift;
1460 my $retval = "";
1461 if ( $self->hasChildNodes() ) {
1462 foreach my $n ( $self->childNodes() ) {
1463 $retval .= $n->toString(@_);
1464 }
1465 }
1466 return $retval;
1467}
1468
146911µs*serialize = \&toString;
1470
14711200ns1;
1472
1473#-------------------------------------------------------------------------#
1474# XML::LibXML::Element Interface #
1475#-------------------------------------------------------------------------#
1476package XML::LibXML::Element;
1477
1478345µs262µs
# spent 36µs (10+26) within XML::LibXML::Element::BEGIN@1478 which was called: # once (10µs+26µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1478
use vars qw(@ISA);
# spent 36µs making 1 call to XML::LibXML::Element::BEGIN@1478 # spent 26µs making 1 call to vars::import
147916µs@ISA = ('XML::LibXML::Node');
1480343µs21.35ms
# spent 679µs (11+668) within XML::LibXML::Element::BEGIN@1480 which was called: # once (11µs+668µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1480
use XML::LibXML qw(:ns :libxml);
# spent 679µs making 1 call to XML::LibXML::Element::BEGIN@1480 # spent 668µs making 1 call to XML::LibXML::import
148131.05ms2203µs
# spent 109µs (15+94) within XML::LibXML::Element::BEGIN@1481 which was called: # once (15µs+94µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1481
use Carp;
# spent 109µs making 1 call to XML::LibXML::Element::BEGIN@1481 # spent 94µs making 1 call to Exporter::import
1482
1483sub setNamespace {
1484 my $self = shift;
1485 my $n = $self->nodeName;
1486 if ( $self->_setNamespace(@_) ){
1487 if ( scalar @_ < 3 || $_[2] == 1 ){
1488 $self->setNodeName( $n );
1489 }
1490 return 1;
1491 }
1492 return 0;
1493}
1494
1495sub getAttribute {
1496 my $self = shift;
1497 my $name = $_[0];
1498 if ( $name =~ /^xmlns(?::|$)/ ) {
1499 # user wants to get a namespace ...
1500 (my $prefix = $name )=~s/^xmlns:?//;
1501 $self->_getNamespaceDeclURI($prefix);
1502 }
1503 else {
1504 $self->_getAttribute(@_);
1505 }
1506}
1507
1508sub setAttribute {
1509 my ( $self, $name, $value ) = @_;
1510 if ( $name =~ /^xmlns(?::|$)/ ) {
1511 # user wants to set the special attribute for declaring XML namespace ...
1512
1513 # this is fine but not exactly DOM conformant behavior, btw (according to DOM we should
1514 # probably declare an attribute which looks like XML namespace declaration
1515 # but isn't)
1516 (my $nsprefix = $name )=~s/^xmlns:?//;
1517 my $nn = $self->nodeName;
1518 if ( $nn =~ /^\Q${nsprefix}\E:/ ) {
1519 # the element has the same prefix
1520 $self->setNamespaceDeclURI($nsprefix,$value) ||
1521 $self->setNamespace($value,$nsprefix,1);
1522 ##
1523 ## We set the namespace here.
1524 ## This is helpful, as in:
1525 ##
1526 ## | $e = XML::LibXML::Element->new('foo:bar');
1527 ## | $e->setAttribute('xmlns:foo','http://yoyodine')
1528 ##
1529 }
1530 else {
1531 # just modify the namespace
1532 $self->setNamespaceDeclURI($nsprefix, $value) ||
1533 $self->setNamespace($value,$nsprefix,0);
1534 }
1535 }
1536 else {
1537 $self->_setAttribute($name, $value);
1538 }
1539}
1540
1541sub getAttributeNS {
1542 my $self = shift;
1543 my ($nsURI, $name) = @_;
1544 croak("invalid attribute name") if !defined($name) or $name eq q{};
1545 if ( defined($nsURI) and $nsURI eq XML_XMLNS_NS ) {
1546 $self->_getNamespaceDeclURI($name eq 'xmlns' ? undef : $name);
1547 }
1548 else {
1549 $self->_getAttributeNS(@_);
1550 }
1551}
1552
1553sub setAttributeNS {
1554 my ($self, $nsURI, $qname, $value)=@_;
1555 unless (defined $qname and length $qname) {
1556 croak("bad name");
1557 }
1558 if (defined($nsURI) and $nsURI eq XML_XMLNS_NS) {
1559 if ($qname !~ /^xmlns(?::|$)/) {
1560 croak("NAMESPACE ERROR: Namespace declarations must have the prefix 'xmlns'");
1561 }
1562 $self->setAttribute($qname,$value); # see implementation above
1563 return;
1564 }
1565 if ($qname=~/:/ and not (defined($nsURI) and length($nsURI))) {
1566 croak("NAMESPACE ERROR: Attribute without a prefix cannot be in a namespace");
1567 }
1568 if ($qname=~/^xmlns(?:$|:)/) {
1569 croak("NAMESPACE ERROR: 'xmlns' prefix and qualified-name are reserved for the namespace ".XML_XMLNS_NS);
1570 }
1571 if ($qname=~/^xml:/ and not (defined $nsURI and $nsURI eq XML_XML_NS)) {
1572 croak("NAMESPACE ERROR: 'xml' prefix is reserved for the namespace ".XML_XML_NS);
1573 }
1574 $self->_setAttributeNS( defined $nsURI ? $nsURI : undef, $qname, $value );
1575}
1576
1577sub getElementsByTagName {
1578 my ( $node , $name ) = @_;
1579 my $xpath = $name eq '*' ? "descendant::*" : "descendant::*[name()='$name']";
1580 my @nodes = $node->_findnodes($xpath);
1581 return wantarray ? @nodes : XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1582}
1583
1584sub getElementsByTagNameNS {
1585 my ( $node, $nsURI, $name ) = @_;
1586 my $xpath;
1587 if ( $name eq '*' ) {
1588 if ( $nsURI eq '*' ) {
1589 $xpath = "descendant::*";
1590 } else {
1591 $xpath = "descendant::*[namespace-uri()='$nsURI']";
1592 }
1593 } elsif ( $nsURI eq '*' ) {
1594 $xpath = "descendant::*[local-name()='$name']";
1595 } else {
1596 $xpath = "descendant::*[local-name()='$name' and namespace-uri()='$nsURI']";
1597 }
1598 my @nodes = $node->_findnodes($xpath);
1599 return wantarray ? @nodes : XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1600}
1601
1602sub getElementsByLocalName {
1603 my ( $node,$name ) = @_;
1604 my $xpath;
1605 if ($name eq '*') {
1606 $xpath = "descendant::*";
1607 } else {
1608 $xpath = "descendant::*[local-name()='$name']";
1609 }
1610 my @nodes = $node->_findnodes($xpath);
1611 return wantarray ? @nodes : XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1612}
1613
1614sub getChildrenByTagName {
1615 my ( $node, $name ) = @_;
1616 my @nodes;
1617 if ($name eq '*') {
1618 @nodes = grep { $_->nodeType == XML_ELEMENT_NODE() }
1619 $node->childNodes();
1620 } else {
1621 @nodes = grep { $_->nodeName eq $name } $node->childNodes();
1622 }
1623 return wantarray ? @nodes : XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1624}
1625
1626sub getChildrenByLocalName {
1627 my ( $node, $name ) = @_;
1628 # my @nodes;
1629 # if ($name eq '*') {
1630 # @nodes = grep { $_->nodeType == XML_ELEMENT_NODE() }
1631 # $node->childNodes();
1632 # } else {
1633 # @nodes = grep { $_->nodeType == XML_ELEMENT_NODE() and
1634 # $_->localName eq $name } $node->childNodes();
1635 # }
1636 # return wantarray ? @nodes : XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1637 my @nodes = $node->_getChildrenByTagNameNS('*',$name);
1638 return wantarray ? @nodes : XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1639}
1640
1641sub getChildrenByTagNameNS {
1642 my ( $node, $nsURI, $name ) = @_;
1643 my @nodes = $node->_getChildrenByTagNameNS($nsURI,$name);
1644 return wantarray ? @nodes : XML::LibXML::NodeList->new_from_ref(\@nodes, 1);
1645}
1646
1647sub appendWellBalancedChunk {
1648 my ( $self, $chunk ) = @_;
1649
1650 my $local_parser = XML::LibXML->new();
1651 my $frag = $local_parser->parse_xml_chunk( $chunk );
1652
1653 $self->appendChild( $frag );
1654}
1655
16561200ns1;
1657
1658#-------------------------------------------------------------------------#
1659# XML::LibXML::Text Interface #
1660#-------------------------------------------------------------------------#
1661package XML::LibXML::Text;
1662
16633372µs2112µs
# spent 64µs (16+48) within XML::LibXML::Text::BEGIN@1663 which was called: # once (16µs+48µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1663
use vars qw(@ISA);
# spent 64µs making 1 call to XML::LibXML::Text::BEGIN@1663 # spent 48µs making 1 call to vars::import
166416µs@ISA = ('XML::LibXML::Node');
1665
1666sub attributes { return undef; }
1667
1668sub deleteDataString {
1669 my $node = shift;
1670 my $string = shift;
1671 my $all = shift;
1672 my $data = $node->nodeValue();
1673 $string =~ s/([\\\*\+\^\{\}\&\?\[\]\(\)\$\%\@])/\\$1/g;
1674 if ( $all ) {
1675 $data =~ s/$string//g;
1676 }
1677 else {
1678 $data =~ s/$string//;
1679 }
1680 $node->setData( $data );
1681}
1682
1683sub replaceDataString {
1684 my ( $node, $left, $right,$all ) = @_;
1685
1686 #ashure we exchange the strings and not expressions!
1687 $left =~ s/([\\\*\+\^\{\}\&\?\[\]\(\)\$\%\@])/\\$1/g;
1688 my $datastr = $node->nodeValue();
1689 if ( $all ) {
1690 $datastr =~ s/$left/$right/g;
1691 }
1692 else{
1693 $datastr =~ s/$left/$right/;
1694 }
1695 $node->setData( $datastr );
1696}
1697
1698sub replaceDataRegEx {
1699 my ( $node, $leftre, $rightre, $flags ) = @_;
1700 return unless defined $leftre;
1701 $rightre ||= "";
1702
1703 my $datastr = $node->nodeValue();
1704 my $restr = "s/" . $leftre . "/" . $rightre . "/";
1705 $restr .= $flags if defined $flags;
1706
1707 eval '$datastr =~ '. $restr;
1708
1709 $node->setData( $datastr );
1710}
1711
17121100ns1;
1713
1714package XML::LibXML::Comment;
1715
1716358µs270µs
# spent 41µs (11+29) within XML::LibXML::Comment::BEGIN@1716 which was called: # once (11µs+29µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1716
use vars qw(@ISA);
# spent 41µs making 1 call to XML::LibXML::Comment::BEGIN@1716 # spent 30µs making 1 call to vars::import
171718µs@ISA = ('XML::LibXML::Text');
1718
17191300ns1;
1720
1721package XML::LibXML::CDATASection;
1722
1723347µs257µs
# spent 34µs (10+24) within XML::LibXML::CDATASection::BEGIN@1723 which was called: # once (10µs+24µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1723
use vars qw(@ISA);
# spent 34µs making 1 call to XML::LibXML::CDATASection::BEGIN@1723 # spent 24µs making 1 call to vars::import
172417µs@ISA = ('XML::LibXML::Text');
1725
17261200ns1;
1727
1728#-------------------------------------------------------------------------#
1729# XML::LibXML::Attribute Interface #
1730#-------------------------------------------------------------------------#
1731package XML::LibXML::Attr;
17323119µs2101µs
# spent 73µs (45+28) within XML::LibXML::Attr::BEGIN@1732 which was called: # once (45µs+28µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1732
use vars qw( @ISA ) ;
# spent 73µs making 1 call to XML::LibXML::Attr::BEGIN@1732 # spent 28µs making 1 call to vars::import
173316µs@ISA = ('XML::LibXML::Node') ;
1734
1735sub setNamespace {
1736 my ($self,$href,$prefix) = @_;
1737 my $n = $self->nodeName;
1738 if ( $self->_setNamespace($href,$prefix) ) {
1739 $self->setNodeName($n);
1740 return 1;
1741 }
1742
1743 return 0;
1744}
1745
17461200ns1;
1747
1748#-------------------------------------------------------------------------#
1749# XML::LibXML::Dtd Interface #
1750#-------------------------------------------------------------------------#
1751# this is still under construction
1752#
1753package XML::LibXML::Dtd;
1754358µs263µs
# spent 37µs (10+27) within XML::LibXML::Dtd::BEGIN@1754 which was called: # once (10µs+27µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1754
use vars qw( @ISA );
# spent 37µs making 1 call to XML::LibXML::Dtd::BEGIN@1754 # spent 27µs making 1 call to vars::import
175516µs@ISA = ('XML::LibXML::Node');
1756
1757# at least DESTROY and CLONE_SKIP must be inherited
1758
17591100ns1;
1760
1761#-------------------------------------------------------------------------#
1762# XML::LibXML::PI Interface #
1763#-------------------------------------------------------------------------#
1764package XML::LibXML::PI;
17653424µs257µs
# spent 33µs (10+24) within XML::LibXML::PI::BEGIN@1765 which was called: # once (10µs+24µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1765
use vars qw( @ISA );
# spent 33µs making 1 call to XML::LibXML::PI::BEGIN@1765 # spent 24µs making 1 call to vars::import
176615µs@ISA = ('XML::LibXML::Node');
1767
1768sub setData {
1769 my $pi = shift;
1770
1771 my $string = "";
1772 if ( scalar @_ == 1 ) {
1773 $string = shift;
1774 }
1775 else {
1776 my %h = @_;
1777 $string = join " ", map {$_.'="'.$h{$_}.'"'} keys %h;
1778 }
1779
1780 # the spec says any char but "?>" [17]
1781 $pi->_setData( $string ) unless $string =~ /\?>/;
1782}
1783
17841200ns1;
1785
1786#-------------------------------------------------------------------------#
1787# XML::LibXML::Namespace Interface #
1788#-------------------------------------------------------------------------#
1789package XML::LibXML::Namespace;
1790
1791sub CLONE_SKIP { 1 }
1792
1793# this is infact not a node!
1794sub prefix { return "xmlns"; }
1795sub getPrefix { return "xmlns"; }
1796sub getNamespaceURI { return "http://www.w3.org/2000/xmlns/" };
1797
1798sub getNamespaces { return (); }
1799
1800
# spent 604µs (502+102) within XML::LibXML::Namespace::nodeName which was called 53 times, avg 11µs/call: # 53 times (502µs+102µs) by XML::LibXML::SAX::Parser::process_element at line 1805, avg 11µs/call
sub nodeName {
18015349µs my $self = shift;
180253321µs53102µs my $nsP = $self->localname;
# spent 102µs making 53 calls to XML::LibXML::Namespace::localname, avg 2µs/call
180353336µs return ( defined($nsP) && length($nsP) ) ? "xmlns:$nsP" : "xmlns";
1804}
180553446µs53604µs
# spent 206µs within XML::LibXML::Namespace::name which was called 53 times, avg 4µs/call: # 53 times (206µs+0s) by XML::LibXML::SAX::Parser::process_element at line 173 of XML/LibXML/SAX/Parser.pm, avg 4µs/call
sub name { goto &nodeName }
# spent 604µs making 53 calls to XML::LibXML::Namespace::nodeName, avg 11µs/call
1806sub getName { goto &nodeName }
1807
1808sub isEqualNode {
1809 my ( $self, $ref ) = @_;
1810 if ( ref($ref) eq "XML::LibXML::Namespace" ) {
1811 return $self->_isEqual($ref);
1812 }
1813 return 0;
1814}
1815
1816sub isSameNode {
1817 my ( $self, $ref ) = @_;
1818 if ( $$self == $$ref ){
1819 return 1;
1820 }
1821 return 0;
1822}
1823
18241200ns1;
1825
1826#-------------------------------------------------------------------------#
1827# XML::LibXML::NamedNodeMap Interface #
1828#-------------------------------------------------------------------------#
1829package XML::LibXML::NamedNodeMap;
1830
18313586µs2672µs
# spent 342µs (12+330) within XML::LibXML::NamedNodeMap::BEGIN@1831 which was called: # once (12µs+330µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1831
use XML::LibXML qw(:libxml);
# spent 342µs making 1 call to XML::LibXML::NamedNodeMap::BEGIN@1831 # spent 330µs making 1 call to XML::LibXML::import
1832
1833sub CLONE_SKIP {
1834 return $XML::LibXML::__threads_shared ? 0 : 1;
1835}
1836
1837sub new {
1838 my $class = shift;
1839 my $self = bless { Nodes => [@_] }, $class;
1840 $self->{NodeMap} = { map { $_->nodeName => $_ } @_ };
1841 return $self;
1842}
1843
1844sub length { return scalar( @{$_[0]->{Nodes}} ); }
1845sub nodes { return $_[0]->{Nodes}; }
1846sub item { $_[0]->{Nodes}->[$_[1]]; }
1847
1848sub getNamedItem {
1849 my $self = shift;
1850 my $name = shift;
1851
1852 return $self->{NodeMap}->{$name};
1853}
1854
1855sub setNamedItem {
1856 my $self = shift;
1857 my $node = shift;
1858
1859 my $retval;
1860 if ( defined $node ) {
1861 if ( scalar @{$self->{Nodes}} ) {
1862 my $name = $node->nodeName();
1863 if ( $node->nodeType() == XML_NAMESPACE_DECL ) {
1864 return;
1865 }
1866 if ( defined $self->{NodeMap}->{$name} ) {
1867 if ( $node->isSameNode( $self->{NodeMap}->{$name} ) ) {
1868 return;
1869 }
1870 $retval = $self->{NodeMap}->{$name}->replaceNode( $node );
1871 }
1872 else {
1873 $self->{Nodes}->[0]->addSibling($node);
1874 }
1875
1876 $self->{NodeMap}->{$name} = $node;
1877 push @{$self->{Nodes}}, $node;
1878 }
1879 else {
1880 # not done yet
1881 # can this be properly be done???
1882 warn "not done yet\n";
1883 }
1884 }
1885 return $retval;
1886}
1887
1888sub removeNamedItem {
1889 my $self = shift;
1890 my $name = shift;
1891 my $retval;
1892 if ( $name =~ /^xmlns/ ) {
1893 warn "not done yet\n";
1894 }
1895 elsif ( exists $self->{NodeMap}->{$name} ) {
1896 $retval = $self->{NodeMap}->{$name};
1897 $retval->unbindNode;
1898 delete $self->{NodeMap}->{$name};
1899 $self->{Nodes} = [grep {not($retval->isSameNode($_))} @{$self->{Nodes}}];
1900 }
1901
1902 return $retval;
1903}
1904
1905sub getNamedItemNS {
1906 my $self = shift;
1907 my $nsURI = shift;
1908 my $name = shift;
1909 return undef;
1910}
1911
1912sub setNamedItemNS {
1913 my $self = shift;
1914 my $nsURI = shift;
1915 my $node = shift;
1916 return undef;
1917}
1918
1919sub removeNamedItemNS {
1920 my $self = shift;
1921 my $nsURI = shift;
1922 my $name = shift;
1923 return undef;
1924}
1925
19261200ns1;
1927
1928package XML::LibXML::_SAXParser;
1929
1930# this is pseudo class!!! and it will be removed as soon all functions
1931# moved to XS level
1932
19333623µs114µs
# spent 14µs within XML::LibXML::_SAXParser::BEGIN@1933 which was called: # once (14µs+0s) by XML::LibXML::SAX::Parser::BEGIN@15 at line 1933
use XML::SAX::Exception;
# spent 14µs making 1 call to XML::LibXML::_SAXParser::BEGIN@1933
1934
1935sub CLONE_SKIP {
1936 return $XML::LibXML::__threads_shared ? 0 : 1;
1937}
1938
1939# these functions will use SAX exceptions as soon i know how things really work
1940sub warning {
1941 my ( $parser, $message, $line, $col ) = @_;
1942 my $error = XML::SAX::Exception::Parse->new( LineNumber => $line,
1943 ColumnNumber => $col,
1944 Message => $message, );
1945 $parser->{HANDLER}->warning( $error );
1946}
1947
1948sub error {
1949 my ( $parser, $message, $line, $col ) = @_;
1950
1951 my $error = XML::SAX::Exception::Parse->new( LineNumber => $line,
1952 ColumnNumber => $col,
1953 Message => $message, );
1954 $parser->{HANDLER}->error( $error );
1955}
1956
1957sub fatal_error {
1958 my ( $parser, $message, $line, $col ) = @_;
1959 my $error = XML::SAX::Exception::Parse->new( LineNumber => $line,
1960 ColumnNumber => $col,
1961 Message => $message, );
1962 $parser->{HANDLER}->fatal_error( $error );
1963}
1964
19651100ns1;
1966
1967package XML::LibXML::RelaxNG;
1968
1969sub CLONE_SKIP { 1 }
1970
1971sub new {
1972 my $class = shift;
1973 my %args = @_;
1974
1975 my $self = undef;
1976 if ( defined $args{location} ) {
1977 $self = $class->parse_location( $args{location} );
1978 }
1979 elsif ( defined $args{string} ) {
1980 $self = $class->parse_buffer( $args{string} );
1981 }
1982 elsif ( defined $args{DOM} ) {
1983 $self = $class->parse_document( $args{DOM} );
1984 }
1985
1986 return $self;
1987}
1988
19891200ns1;
1990
1991package XML::LibXML::Schema;
1992
1993sub CLONE_SKIP { 1 }
1994
1995sub new {
1996 my $class = shift;
1997 my %args = @_;
1998
1999 my $self = undef;
2000 if ( defined $args{location} ) {
2001 $self = $class->parse_location( $args{location} );
2002 }
2003 elsif ( defined $args{string} ) {
2004 $self = $class->parse_buffer( $args{string} );
2005 }
2006
2007 return $self;
2008}
2009
20101200ns1;
2011
2012#-------------------------------------------------------------------------#
2013# XML::LibXML::Pattern Interface #
2014#-------------------------------------------------------------------------#
2015
2016package XML::LibXML::Pattern;
2017
2018sub CLONE_SKIP { 1 }
2019
2020sub new {
2021 my $class = shift;
2022 my ($pattern,$ns_map)=@_;
2023 my $self = undef;
2024
2025 unless (UNIVERSAL::can($class,'_compilePattern')) {
2026 croak("Cannot create XML::LibXML::Pattern - ".
2027 "your libxml2 is compiled without pattern support!");
2028 }
2029
2030 if (ref($ns_map) eq 'HASH') {
2031 # translate prefix=>URL hash to a (URL,prefix) list
2032 $self = $class->_compilePattern($pattern,0,[reverse %$ns_map]);
2033 } else {
2034 $self = $class->_compilePattern($pattern,0);
2035 }
2036 return $self;
2037}
2038
20391200ns1;
2040
2041#-------------------------------------------------------------------------#
2042# XML::LibXML::RegExp Interface #
2043#-------------------------------------------------------------------------#
2044
2045package XML::LibXML::RegExp;
2046
2047sub CLONE_SKIP { 1 }
2048
2049sub new {
2050 my $class = shift;
2051 my ($regexp)=@_;
2052 unless (UNIVERSAL::can($class,'_compile')) {
2053 croak("Cannot create XML::LibXML::RegExp - ".
2054 "your libxml2 is compiled without regexp support!");
2055 }
2056 return $class->_compile($regexp);
2057}
2058
20591200ns1;
2060
2061#-------------------------------------------------------------------------#
2062# XML::LibXML::XPathExpression Interface #
2063#-------------------------------------------------------------------------#
2064
2065package XML::LibXML::XPathExpression;
2066
2067sub CLONE_SKIP { 1 }
2068
20691200ns1;
2070
2071
2072#-------------------------------------------------------------------------#
2073# XML::LibXML::InputCallback Interface #
2074#-------------------------------------------------------------------------#
2075package XML::LibXML::InputCallback;
2076
2077351µs2140µs
# spent 77µs (13+63) within XML::LibXML::InputCallback::BEGIN@2077 which was called: # once (13µs+63µs) by XML::LibXML::SAX::Parser::BEGIN@15 at line 2077
use vars qw($_CUR_CB @_GLOBAL_CALLBACKS @_CB_STACK);
# spent 77µs making 1 call to XML::LibXML::InputCallback::BEGIN@2077 # spent 63µs making 1 call to vars::import
2078
2079
# spent 6µs within XML::LibXML::InputCallback::BEGIN@2079 which was called: # once (6µs+0s) by XML::LibXML::SAX::Parser::BEGIN@15 at line 2083
BEGIN {
20801400ns $_CUR_CB = undef;
20811500ns @_GLOBAL_CALLBACKS = ();
208215µs @_CB_STACK = ();
20831737µs16µs}
# spent 6µs making 1 call to XML::LibXML::InputCallback::BEGIN@2079
2084
2085sub CLONE_SKIP {
2086 return $XML::LibXML::__threads_shared ? 0 : 1;
2087}
2088
2089#-------------------------------------------------------------------------#
2090# global callbacks #
2091#-------------------------------------------------------------------------#
2092
# spent 60µs within XML::LibXML::InputCallback::_callback_match which was called 6 times, avg 10µs/call: # 4 times (33µs+0s) by XML::LibXML::_parse_file at line 923, avg 8µs/call # 2 times (27µs+0s) by XML::LibXSLT::_parse_stylesheet at line 249 of XML/LibXSLT.pm, avg 13µs/call
sub _callback_match {
2093612µs my $uri = shift;
209465µs my $retval = 0;
2095
2096 # loop through the callbacks and and find the first matching
2097 # The callbacks are stored in execution order (reverse stack order)
2098 # any new global callbacks are shifted to the callback stack.
2099618µs foreach my $cb ( @_GLOBAL_CALLBACKS ) {
2100
2101 # callbacks have to return 1, 0 or undef, while 0 and undef
2102 # are handled the same way.
2103 # in fact, if callbacks return other values, the global match
2104 # assumes silently that the callback failed.
2105
2106 $retval = $cb->[0]->($uri);
2107
2108 if ( defined $retval and $retval == 1 ) {
2109 # make the other callbacks use this callback
2110 $_CUR_CB = $cb;
2111 unshift @_CB_STACK, $cb;
2112 last;
2113 }
2114 }
2115
2116651µs return $retval;
2117}
2118
2119sub _callback_open {
2120 my $uri = shift;
2121 my $retval = undef;
2122
2123 # the open callback has to return a defined value.
2124 # if one works on files this can be a file handle. But
2125 # depending on the needs of the callback it also can be a
2126 # database handle or a integer labeling a certain dataset.
2127
2128 if ( defined $_CUR_CB ) {
2129 $retval = $_CUR_CB->[1]->( $uri );
2130
2131 # reset the callbacks, if one callback cannot open an uri
2132 if ( not defined $retval or $retval == 0 ) {
2133 shift @_CB_STACK;
2134 $_CUR_CB = $_CB_STACK[0];
2135 }
2136 }
2137
2138 return $retval;
2139}
2140
2141sub _callback_read {
2142 my $fh = shift;
2143 my $buflen = shift;
2144
2145 my $retval = undef;
2146
2147 if ( defined $_CUR_CB ) {
2148 $retval = $_CUR_CB->[2]->( $fh, $buflen );
2149 }
2150
2151 return $retval;
2152}
2153
2154sub _callback_close {
2155 my $fh = shift;
2156 my $retval = 0;
2157
2158 if ( defined $_CUR_CB ) {
2159 $retval = $_CUR_CB->[3]->( $fh );
2160 shift @_CB_STACK;
2161 $_CUR_CB = $_CB_STACK[0];
2162 }
2163
2164 return $retval;
2165}
2166
2167#-------------------------------------------------------------------------#
2168# member functions and methods #
2169#-------------------------------------------------------------------------#
2170
2171
# spent 591µs within XML::LibXML::InputCallback::new which was called 54 times, avg 11µs/call: # 53 times (586µs+0s) by XML::LibXML::_init_callbacks at line 722, avg 11µs/call # once (4µs+0s) by XML::LibXSLT::_init_callbacks at line 217 of XML/LibXSLT.pm
sub new {
217254123µs my $CLASS = shift;
217354554µs return bless {'_CALLBACKS' => []}, $CLASS;
2174}
2175
2176# add a callback set to the callback stack
2177# synopsis: $icb->register_callbacks( [$match_cb, $open_cb, $read_cb, $close_cb] );
2178sub register_callbacks {
2179 my $self = shift;
2180 my $cbset = shift;
2181
2182 # test if callback set is complete
2183 if ( ref $cbset eq "ARRAY" and scalar( @$cbset ) == 4 ) {
2184 unshift @{$self->{_CALLBACKS}}, $cbset;
2185 }
2186}
2187
2188# remove a callback set to the callback stack
2189# if a callback set is passed, this function will check for the match function
2190
# spent 437µs within XML::LibXML::InputCallback::unregister_callbacks which was called 54 times, avg 8µs/call: # 54 times (437µs+0s) by XML::LibXML::_cleanup_callbacks at line 741, avg 8µs/call
sub unregister_callbacks {
21915435µs my $self = shift;
21925435µs my $cbset = shift;
219354365µs if ( ref $cbset eq "ARRAY" and scalar( @$cbset ) == 4 ) {
2194 $self->{_CALLBACKS} = [grep { $_->[0] != $cbset->[0] } @{$self->{_CALLBACKS}}];
2195 }
2196 else {
21975481µs shift @{$self->{_CALLBACKS}};
2198 }
2199}
2200
2201# make libxml2 use the callbacks
2202
# spent 1.48ms (1.12+359µs) within XML::LibXML::InputCallback::init_callbacks which was called 80 times, avg 19µs/call: # 54 times (894µs+312µs) by XML::LibXML::_init_callbacks at line 734, avg 22µs/call # 25 times (221µs+45µs) by XML::LibXSLT::StylesheetWrapper::_init_callbacks at line 435 of XML/LibXSLT.pm, avg 11µs/call # once (6µs+2µs) by XML::LibXSLT::_init_callbacks at line 231 of XML/LibXSLT.pm
sub init_callbacks {
22038072µs my $self = shift;
2204
220580118µs $_CUR_CB = undef;
220680107µs @_CB_STACK = ();
2207
220880131µs @_GLOBAL_CALLBACKS = @{ $self->{_CALLBACKS} };
2209
22108068µs if ( defined $XML::LibXML::match_cb and
2211 defined $XML::LibXML::open_cb and
2212 defined $XML::LibXML::read_cb and
2213 defined $XML::LibXML::close_cb ) {
2214 push @_GLOBAL_CALLBACKS, [$XML::LibXML::match_cb,
2215 $XML::LibXML::open_cb,
2216 $XML::LibXML::read_cb,
2217 $XML::LibXML::close_cb];
2218 }
2219
2220801.01ms80359µs $self->lib_init_callbacks();
# spent 359µs making 80 calls to XML::LibXML::InputCallback::lib_init_callbacks, avg 4µs/call
2221}
2222
2223# reset libxml2's callbacks
2224
# spent 1.09ms (844µs+244µs) within XML::LibXML::InputCallback::cleanup_callbacks which was called 80 times, avg 14µs/call: # 54 times (578µs+157µs) by XML::LibXML::_cleanup_callbacks at line 739, avg 14µs/call # 25 times (251µs+83µs) by XML::LibXSLT::StylesheetWrapper::_cleanup_callbacks at line 445 of XML/LibXSLT.pm, avg 13µs/call # once (15µs+4µs) by XML::LibXSLT::_cleanup_callbacks at line 236 of XML/LibXSLT.pm
sub cleanup_callbacks {
22258056µs my $self = shift;
2226
22278062µs $_CUR_CB = undef;
22288091µs @_GLOBAL_CALLBACKS = ();
22298041µs @_CB_STACK = ();
2230
2231801.01ms80244µs $self->lib_cleanup_callbacks();
# spent 244µs making 80 calls to XML::LibXML::InputCallback::lib_cleanup_callbacks, avg 3µs/call
2232}
2233
22341500ns$XML::LibXML::__loaded=1;
2235
2236132µs1;
2237
2238__END__
 
# spent 3.74ms within XML::LibXML::Attr::name which was called 2581 times, avg 1µs/call: # 2581 times (3.74ms+0s) by XML::LibXML::SAX::Parser::process_element at line 212 of XML/LibXML/SAX/Parser.pm, avg 1µs/call
sub XML::LibXML::Attr::name; # xsub
# spent 6.47ms within XML::LibXML::Attr::value which was called 2581 times, avg 3µs/call: # 2581 times (6.47ms+0s) by XML::LibXML::SAX::Parser::process_element at line 220 of XML/LibXML/SAX/Parser.pm, avg 3µs/call
sub XML::LibXML::Attr::value; # xsub
# spent 13µs within XML::LibXML::CORE:match which was called 9 times, avg 1µs/call: # 4 times (3µs+0s) by XML::LibXML::import at line 183, avg 875ns/call # 4 times (1µs+0s) by XML::LibXML::import at line 206, avg 350ns/call # once (8µs+0s) by XML::LibXML::SAX::Parser::BEGIN@15 at line 221
sub XML::LibXML::CORE:match; # opcode
# spent 80µs within XML::LibXML::Document::encoding which was called 28 times, avg 3µs/call: # 28 times (80µs+0s) by XML::LibXML::SAX::Parser::generate at line 72 of XML/LibXML/SAX/Parser.pm, avg 3µs/call
sub XML::LibXML::Document::encoding; # xsub
# spent 86µs within XML::LibXML::Document::externalSubset which was called 28 times, avg 3µs/call: # 28 times (86µs+0s) by XML::LibXML::SAX::Parser::generate at line 66 of XML/LibXML/SAX/Parser.pm, avg 3µs/call
sub XML::LibXML::Document::externalSubset; # xsub
# spent 51µs within XML::LibXML::Document::getEncoding which was called 28 times, avg 2µs/call: # 28 times (51µs+0s) by XML::LibXML::SAX::Parser::generate at line 90 of XML/LibXML/SAX/Parser.pm, avg 2µs/call
sub XML::LibXML::Document::getEncoding; # xsub
# spent 86µs within XML::LibXML::Document::getVersion which was called 28 times, avg 3µs/call: # 28 times (86µs+0s) by XML::LibXML::SAX::Parser::generate at line 90 of XML/LibXML/SAX/Parser.pm, avg 3µs/call
sub XML::LibXML::Document::getVersion; # xsub
# spent 70µs within XML::LibXML::Document::version which was called 28 times, avg 3µs/call: # 28 times (70µs+0s) by XML::LibXML::SAX::Parser::generate at line 73 of XML/LibXML/SAX/Parser.pm, avg 3µs/call
sub XML::LibXML::Document::version; # xsub
# spent 66µs within XML::LibXML::END which was called: # once (66µs+0s) by main::RUNTIME at line 0 of /usr/share/koha/opac/cgi-bin/opac/opac-search.pl
sub XML::LibXML::END; # xsub
# spent 244µs within XML::LibXML::InputCallback::lib_cleanup_callbacks which was called 80 times, avg 3µs/call: # 80 times (244µs+0s) by XML::LibXML::InputCallback::cleanup_callbacks at line 2231, avg 3µs/call
sub XML::LibXML::InputCallback::lib_cleanup_callbacks; # xsub
# spent 359µs within XML::LibXML::InputCallback::lib_init_callbacks which was called 80 times, avg 4µs/call: # 80 times (359µs+0s) by XML::LibXML::InputCallback::init_callbacks at line 2220, avg 4µs/call
sub XML::LibXML::InputCallback::lib_init_callbacks; # xsub
# spent 33µs within XML::LibXML::LIBXML_RUNTIME_VERSION which was called: # once (33µs+0s) by XML::LibXML::SAX::Parser::BEGIN@15 at line 221
sub XML::LibXML::LIBXML_RUNTIME_VERSION; # xsub
# spent 7µs within XML::LibXML::LIBXML_VERSION which was called: # once (7µs+0s) by XML::LibXML::SAX::Parser::BEGIN@15 at line 222
sub XML::LibXML::LIBXML_VERSION; # xsub
# spent 411µs within XML::LibXML::Namespace::DESTROY which was called 106 times, avg 4µs/call: # 53 times (302µs+0s) by XML::LibXML::SAX::Parser::process_element at line 233 of XML/LibXML/SAX/Parser.pm, avg 6µs/call # 25 times (68µs+0s) by XML::LibXML::SAX::Parser::process_element at line 102 of XML/LibXML/SAX/Parser.pm, avg 3µs/call # 25 times (34µs+0s) by XML::LibXML::SAX::Parser::process_node at line 127 of XML/LibXML/SAX/Parser.pm, avg 1µs/call # 3 times (7µs+0s) by XML::LibXML::SAX::Parser::process_element at line 244 of XML/LibXML/SAX/Parser.pm, avg 2µs/call
sub XML::LibXML::Namespace::DESTROY; # xsub
# spent 398µs within XML::LibXML::Namespace::href which was called 159 times, avg 3µs/call: # 53 times (161µs+0s) by XML::LibXML::SAX::Parser::process_element at line 254 of XML/LibXML/SAX/Parser.pm, avg 3µs/call # 53 times (139µs+0s) by XML::LibXML::SAX::Parser::process_element at line 158 of XML/LibXML/SAX/Parser.pm, avg 3µs/call # 53 times (99µs+0s) by XML::LibXML::SAX::Parser::process_element at line 195 of XML/LibXML/SAX/Parser.pm, avg 2µs/call
sub XML::LibXML::Namespace::href; # xsub
# spent 409µs within XML::LibXML::Namespace::localname which was called 268 times, avg 2µs/call: # 81 times (115µs+0s) by XML::LibXML::SAX::Parser::process_element at line 158 of XML/LibXML/SAX/Parser.pm, avg 1µs/call # 81 times (107µs+0s) by XML::LibXML::SAX::Parser::process_element at line 254 of XML/LibXML/SAX/Parser.pm, avg 1µs/call # 53 times (102µs+0s) by XML::LibXML::Namespace::nodeName at line 1802, avg 2µs/call # 53 times (84µs+0s) by XML::LibXML::SAX::Parser::process_element at line 186 of XML/LibXML/SAX/Parser.pm, avg 2µs/call
sub XML::LibXML::Namespace::localname; # xsub
# spent 13.3ms within XML::LibXML::Node::DESTROY which was called 7493 times, avg 2µs/call: # 4777 times (6.28ms+0s) by XML::LibXML::SAX::Parser::process_element at line 247 of XML/LibXML/SAX/Parser.pm, avg 1µs/call # 2581 times (3.60ms+0s) by XML::LibXML::SAX::Parser::process_element at line 233 of XML/LibXML/SAX/Parser.pm, avg 1µs/call # 50 times (1.38ms+0s) by C4::XSLT::XSLTParse4Display at line 2014 of /usr/share/koha/lib/C4/Search.pm, avg 28µs/call # 28 times (1.63ms+0s) by XML::LibXML::SAX::Parser::_parse_string or XML::LibXML::SAX::Parser::_parse_systemid at line 2602 of XML/SAX/Base.pm, avg 58µs/call # 28 times (54µs+0s) by XML::LibXML::SAX::Parser::generate at line 92 of XML/LibXML/SAX/Parser.pm, avg 2µs/call # 25 times (50µs+0s) by XML::LibXML::SAX::Parser::generate at line 43 of XML/LibXML/SAX/Parser.pm, avg 2µs/call # 3 times (6µs+0s) by XML::LibXML::SAX::Parser::generate at line 50 of XML/LibXML/SAX/Parser.pm, avg 2µs/call # once (290µs+0s) by C4::XSLT::XSLTParse4Display at line 228 of /usr/share/koha/lib/C4/XSLT.pm
sub XML::LibXML::Node::DESTROY; # xsub
# spent 7.72ms within XML::LibXML::Node::_attributes which was called 1619 times, avg 5µs/call: # 1619 times (7.72ms+0s) by XML::LibXML::Node::attributes at line 1267, avg 5µs/call
sub XML::LibXML::Node::_attributes; # xsub
# spent 10.6ms within XML::LibXML::Node::_childNodes which was called 1647 times, avg 6µs/call: # 1647 times (10.6ms+0s) by XML::LibXML::Node::childNodes at line 1255, avg 6µs/call
sub XML::LibXML::Node::_childNodes; # xsub
# spent 206µs within XML::LibXML::Node::getData which was called 39 times, avg 5µs/call: # 39 times (206µs+0s) by XML::LibXML::SAX::Parser::process_node at line 102 of XML/LibXML/SAX/Parser.pm, avg 5µs/call
sub XML::LibXML::Node::getData; # xsub
# spent 2.80ms within XML::LibXML::Node::getNamespaces which was called 1619 times, avg 2µs/call: # 1619 times (2.80ms+0s) by XML::LibXML::SAX::Parser::process_element at line 155 of XML/LibXML/SAX/Parser.pm, avg 2µs/call
sub XML::LibXML::Node::getNamespaces; # xsub
# spent 11.1ms within XML::LibXML::Node::localname which was called 6781 times, avg 2µs/call: # 2581 times (4.94ms+0s) by XML::LibXML::SAX::Parser::process_element at line 209 of XML/LibXML/SAX/Parser.pm, avg 2µs/call # 2581 times (3.75ms+0s) by XML::LibXML::SAX::Parser::process_element at line 220 of XML/LibXML/SAX/Parser.pm, avg 1µs/call # 1619 times (2.40ms+0s) by XML::LibXML::SAX::Parser::process_element at line 233 of XML/LibXML/SAX/Parser.pm, avg 1µs/call
sub XML::LibXML::Node::localname; # xsub
# spent 7.48ms within XML::LibXML::Node::namespaceURI which was called 4200 times, avg 2µs/call: # 2581 times (4.42ms+0s) by XML::LibXML::SAX::Parser::process_element at line 206 of XML/LibXML/SAX/Parser.pm, avg 2µs/call # 1619 times (3.06ms+0s) by XML::LibXML::SAX::Parser::process_element at line 233 of XML/LibXML/SAX/Parser.pm, avg 2µs/call
sub XML::LibXML::Node::namespaceURI; # xsub
# spent 3.92ms within XML::LibXML::Node::nodeName which was called 1619 times, avg 2µs/call: # 1619 times (3.92ms+0s) by XML::LibXML::SAX::Parser::process_element at line 233 of XML/LibXML/SAX/Parser.pm, avg 2µs/call
sub XML::LibXML::Node::nodeName; # xsub
# spent 10.7ms within XML::LibXML::Node::nodeType which was called 4861 times, avg 2µs/call: # 4833 times (10.6ms+0s) by XML::LibXML::SAX::Parser::process_node at line 101 of XML/LibXML/SAX/Parser.pm, avg 2µs/call # 28 times (124µs+0s) by XML::LibXML::SAX::Parser::generate at line 87 of XML/LibXML/SAX/Parser.pm, avg 4µs/call
sub XML::LibXML::Node::nodeType; # xsub
# spent 8.75ms within XML::LibXML::Node::nodeValue which was called 3147 times, avg 3µs/call: # 3147 times (8.75ms+0s) by XML::LibXML::SAX::Parser::process_node at line 102 of XML/LibXML/SAX/Parser.pm, avg 3µs/call
sub XML::LibXML::Node::nodeValue; # xsub
# spent 246µs within XML::LibXML::Node::ownerDocument which was called 28 times, avg 9µs/call: # 28 times (246µs+0s) by XML::LibXML::SAX::Parser::generate at line 57 of XML/LibXML/SAX/Parser.pm, avg 9µs/call
sub XML::LibXML::Node::ownerDocument; # xsub
# spent 5.84ms within XML::LibXML::Node::prefix which was called 4200 times, avg 1µs/call: # 2581 times (3.66ms+0s) by XML::LibXML::SAX::Parser::process_element at line 215 of XML/LibXML/SAX/Parser.pm, avg 1µs/call # 1619 times (2.18ms+0s) by XML::LibXML::SAX::Parser::process_element at line 233 of XML/LibXML/SAX/Parser.pm, avg 1µs/call
sub XML::LibXML::Node::prefix; # xsub
# spent 2.83ms (2.80+33µs) within XML::LibXML::_parse_file which was called 4 times, avg 709µs/call: # 4 times (2.80ms+33µs) by XML::LibXML::parse_file at line 923, avg 709µs/call
sub XML::LibXML::_parse_file; # xsub
# spent 12.8ms within XML::LibXML::_parse_string which was called 50 times, avg 255µs/call: # 50 times (12.8ms+0s) by XML::LibXML::parse_string at line 846, avg 255µs/call
sub XML::LibXML::_parse_string; # xsub
# spent 857µs within XML::LibXML::bootstrap which was called: # once (857µs+0s) by DynaLoader::bootstrap at line 215 of DynaLoader.pm
sub XML::LibXML::bootstrap; # xsub