Author: jasons
Date: Mon Nov 10 10:20:50 2003
New Revision: 119

Modified:
   xml/xerces-p/trunk/Xerces-extra.pm
Log:
added XML::Xerces::XMLCatalogResolver
        depricated DOMElement::get_text()
        added AttDefList::to_hash() and AttDefList::to_list()

Modified: xml/xerces-p/trunk/Xerces-extra.pm
==============================================================================
--- xml/xerces-p/trunk/Xerces-extra.pm  (original)
+++ xml/xerces-p/trunk/Xerces-extra.pm  Mon Nov 10 10:20:50 2003
@@ -19,21 +19,29 @@
 
 package XML::Xerces;
 use Carp;
-use vars qw(@EXPORT_OK);
+use vars qw(@EXPORT_OK $VERSION);
 @EXPORT_OK = qw(error);
+$VERSION = q[2.3.0-4];
+
 sub error {
   my $error = shift;
-  print STDERR "Error in eval: ";
+  my $context = shift;
+  my $msg = "Error in eval: ";
   if (ref $error) {
     if ($error->isa('XML::Xerces::DOMException')) {
-      croak "Message: <", $error->getMessage(), 
-       "> Code: ", $XML::Xerces::DOMException::CODES[$error->getCode];
+      $msg .= "Message: <"
+        . $error->getMessage()
+       . "> Code: "
+        . $XML::Xerces::DOMException::CODES[$error->getCode];
     } else {
-      croak $error->getMessage();
+      $msg .= $error->getMessage();
     }
   } else {
-    croak $error;
+    $msg .= $error;
   }
+  $msg .= ", Context: $context"
+    if defined $context;
+  croak($msg);
 }
 
 package XML::Xerces::DOMException;
@@ -182,6 +190,38 @@
 
 sub reset_errors {}
 
+package XML::Xerces::XMLAttDefList;
+#
+# This class is both a list and a hash, so at the moment we
+# enable users to choose how to access the information. Perhaps
+# in the future we will use an order preserving hash like Tie::IxHash.
+#
+
+# convert the AttDefList to a perl list
+sub to_list {
+  my $self = shift;
+  my @list;
+  if ($self->hasMoreElements()) {
+    while ($self->hasMoreElements()) {
+      push(@list,$self->nextElement());
+    }
+  }
+  return @list;
+}
+
+# convert the AttDefList to a perl hash
+sub to_hash {
+  my $self = shift;
+  my %hash;
+  if ($self->hasMoreElements()) {
+    while ($self->hasMoreElements()) {
+      my $attr = $self->nextElement();
+      $hash{$attr->getFullName()} = $attr;
+    }
+  }
+  return %hash;
+}
+
 package XML::Xerces::DOMNodeList;
 # convert the NodeList to a perl list
 sub to_list {
@@ -289,6 +329,7 @@
 package XML::Xerces::DOMElement;
 sub serialize {
   my ($self,$indent) = @_;
+  $indent ||= 0;
   my $output;
   ELEMENT: {
     my $node_name = $self->getNodeName;
@@ -387,14 +428,84 @@
   return shift->{code};
 }
 
+# in previous versions we needed to define this method
+# but it is now obsolete
 package XML::Xerces::DOMElement;
 sub get_text {
-  my $node = shift;
-  my @nodes = $node->getChildNodes();
-  my $text;
-  foreach (@nodes) {
-    $text .= $_->getNodeValue()
-      if $_->isa('XML::Xerces::DOMText');
+  my $self = shift;
+  warn "XML::Xerces::DOMElement::get_text is depricated, use getTextContent instead";
+  return $self->getTextContent(@_);
+}
+
+package XML::Xerces::XMLCatalogResolver;
+use XML::Xerces qw(error);
+use strict;
+use Carp;
+use vars qw($VERSION
+           @ISA
+           @EXPORT
+           @EXPORT_OK
+           $CATALOG
+           %MAPS
+           %REMAPS
+          );
+require Exporter;
+
[EMAIL PROTECTED] = qw(Exporter XML::Xerces::PerlEntityResolver);
[EMAIL PROTECTED] = qw();
+
+sub new {
+  my $pkg = shift;
+  my $catalog = shift;
+  my $self = bless {}, $pkg;
+  $self->initialize($catalog);
+  return $self;
+}
+
+sub initialize {
+  my $self = shift;
+
+  # allow callers to set the global variable
+  $CATALOG = shift
+    unless $CATALOG;
+
+  my $DOM = XML::Xerces::XercesDOMParser->new();
+  my $ERROR_HANDLER = XML::Xerces::PerlErrorHandler->new();
+  $DOM->setErrorHandler($ERROR_HANDLER);
+
+  # we parse the example XML Catalog
+  eval{$DOM->parse($CATALOG)};
+  error ($@, __PACKAGE__ . ": Couldn't parse catalog: $CATALOG")
+      if $@;
+
+  # now retrieve the mappings
+  my $doc = $DOM->getDocument();
+  my @Maps = $doc->getElementsByTagName('Map');
+  %MAPS = map {($_->getAttribute('PublicId'),
+                  $_->getAttribute('HRef'))} @Maps;
+  my @Remaps = $doc->getElementsByTagName('Remap');
+  %REMAPS = map {($_->getAttribute('SystemId'),
+                    $_->getAttribute('HRef'))} @Remaps;
+}
+
+sub resolve_entity {
+  my ($self,$pub,$sys) = @_;
+#   print STDERR "Got PUBLIC: $pub\n";
+#   print STDERR "Got SYSTEM: $sys\n";
+
+  # now check which one we were asked for
+  my $href;
+  if ($pub) {
+    $href = $MAPS{$pub};
+  } elsif ($sys) {
+    $href = $REMAPS{$sys};
+  } else {
+    croak("Neither PublicId or SystemId were defined");
   }
-  return $text;
+
+  my $is = eval {XML::Xerces::LocalFileInputSource->new($href)};
+  error($@,"Couldn't create input source for $href")
+      if $@;
+  return $is;
 }
+

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to