# $Id: GDOMECompat.pm,v 1.8 2003/01/22 15:06:12 pajas Exp $ package XML::XSH::GDOMECompat; use XML::GDOME; use strict; use Carp; sub module { return "XML::GDOME"; } sub version { return $XML::GDOME::VERSION; } sub new_parser { return XML::GDOME->new(); } sub toStringUTF8 { my ($class,$node,$mode)=@_; # this is wrong, we should recode from doc encoding # but how to find out which it is? if ($class->is_document($node)) { return $node->toString($mode); } else { return $node->toString(); } } sub owner_document { my ($self,$node)=@_; if ($self->is_document($node)) { return $node } else { return $node->getOwnerDocument() } } sub doc_URI { return undef; } sub set_encoding { my ($class,$dom,$encoding)=@_; croak "Changing document encoding not supported by GDOME\n"; return; } sub doc_encoding { my ($class,$dom)=@_; return ''; # not implemented ? } sub xml_equal { my ($class,$a,$b)=@_; return 0 unless (ref($a) and ref($b)); return $a->gdome_ref == $b->gdome_ref } sub count_xpath { my ($class,$node,$xp)=@_; my $res = $node->xpath_evaluate($xp); my $type = $res->resultType; if ($type == XML::GDOME::UNORDERED_NODE_ITERATOR_TYPE || $type == XML::GDOME::ORDERED_NODE_ITERATOR_TYPE) { my $count=0; while ($res->iterateNext) { $count++; } return $count; } elsif ($type == XML::GDOME::NUMBER_TYPE()) { return $res->numberValue; } elsif ($type == XML::GDOME::STRING_TYPE()) { return $res->stringValue; } elsif ($type == XML::GDOME::BOOLEAN_TYPE()) { return $res->booleanValue; } else { croak("Unknown result type"); } } sub doc_process_xinclude { my ($class,$parser,$doc)=@_; $doc->process_xinclude(); } sub parser_options { my $mode=GDOME_LOAD_PARSING; $mode |= GDOME_LOAD_VALIDATING if $XML::XSH::Functions::VALIDATION; $mode |= GDOME_LOAD_RECOVERING if $XML::XSH::Functions::RECOVERING; $mode |= GDOME_LOAD_SUBSTITUTE_ENTITIES if $XML::XSH::Functions::PARSER_EXPANDS_ENTITIES; $mode |= GDOME_LOAD_COMPLETE_ATTRS if $XML::XSH::Functions::PARSER_COMPLETES_ATTRIBUTES; } sub load_catalog { croak "catalogs not supported by GDOME\n"; return undef; } sub parse_html_file { croak "HTML parsing not supported by GDOME\n"; return undef; } sub parse_html_fh { croak "HTML parsing not supported by GDOME\n"; return undef; } sub parse_sgml_file { croak "DOCBOOK parsing not supported by GDOME\n"; return undef; } sub parse_sgml_fh { croak "DOCBOOK parsing not supported by GDOME\n"; return undef; } sub parse_string { my ($class,$parser,$str)=@_; my $doc =$parser->createDocFromString($str,parser_options()); if ( $XML::XSH::Functions::PARSER_EXPANDS_XINCLUDE ) { $doc->process_xinclude(); } return $doc; } sub parse_fh { my ($class,$parser,$fh)=@_; local $/ = undef; my $str = <$fh>; my $doc = $parser->createDocFromString($str,parser_options()); if ( $XML::XSH::Functions::PARSER_EXPANDS_XINCLUDE ) { $doc->process_xinclude(); } return $doc; } sub parse_file { my ($class,$parser, $uri) = @_; my $doc = $parser->createDocFromURI($uri,parser_options()); if ( $XML::XSH::Functions::PARSER_EXPANDS_XINCLUDE ) { $doc->process_xinclude(); } return $doc; } sub is_xinclude_start { return 0; # not supported } sub is_xinclude_end { return 0; # not supported } sub is_element { my ($class,$node)=@_; return $node->nodeType == ELEMENT_NODE; } sub is_attribute { my ($class,$node)=@_; my $type=$node->getNodeType(); my $attype=ATTRIBUTE_NODE(); return $type == $attype; } sub is_text { my ($class,$node)=@_; return $node->nodeType == TEXT_NODE; } sub is_text_or_cdata { my ($class,$node)=@_; return $node->nodeType == TEXT_NODE || $node->nodeType == CDATA_SECTION_NODE; } sub is_cdata_section { my ($class,$node)=@_; return $node->nodeType == CDATA_SECTION_NODE; } sub is_pi { my ($class,$node)=@_; return $node->nodeType == PROCESSING_INSTRUCTION_NODE; } sub is_entity_reference { my ($class,$node)=@_; return $node->nodeType == ENTITY_REFERENCE_NODE; } sub is_document { my ($class,$node)=@_; return $node->nodeType == DOCUMENT_NODE; } sub is_document_fragment { my ($class,$node)=@_; return $node->nodeType == DOCUMENT_FRAGMENT_NODE; } sub is_comment { my ($class,$node)=@_; return $node->nodeType == COMMENT_NODE; } sub is_namespace { my ($class,$node)=@_; return $node->nodeType == XPATH_NAMESPACE_NODE; } sub get_dtd { die "Not implemented for GDOME\n"; } sub has_dtd { 0; } sub clone_node { my ($class, $dom, $node)=@_; return $dom->importNode($node,1); } sub remove_node { my ($class,$node)=@_; my $parent=$node->getParentNode(); if ($parent) { return $parent->removeChild($node); } } package XML::GDOME::Document; sub getEncoding { return "utf-8"; } 1;