CSCI 5733.1
XML Application Development
Summer 2004
Suggested Solution to Mid-Term Examination

(1) For example,

import java.io.*;

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;

public class XmlToText extends DefaultHandler
{
    public static void main(String argv[])
    {
        if (argv.length != 1) {
            System.err.println("Usage: java XmlToText filename");
            System.exit(1);
        }
  
        // Use an instance of ourselves as the SAX event handler
        DefaultHandler handler = new XmlToText();
        // Use the default (non-validating) parser
        SAXParserFactory factory = SAXParserFactory.newInstance();

        try {
            SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(new File(argv [0]), handler);
            //   print output
            System.out.println(text);
        } catch (Throwable t) {
            t.printStackTrace();
        }
   }
  
   //   Data members
   static private StringBuffer text = new StringBuffer();

   //   Handler method
   public void characters(char[] ch,
      int start,
      int length)
      throws SAXException
   {   text.append(new String(ch, start, length));
   }   //   characters

   public void ignorableWhitespace(char[] ch,
      int start,
      int length)
      throws SAXException
   {   text.append(new String(ch, start, length));
   }   //   characters

   public String getText() {
      return text.toString();
   }
}   //   XmlToText.

(2) (a) For example,

use LWP::Simple;
use strict;
my $url = "http://dcm.uhcl.edu/yue/authors.xml";
my $urlContents = get($url);

my $csv = "";
while ($urlContents =~ /<author.*?>.*?<name.*?>(.*?)<\/name.*?>(.*?)<\/author.*?>/gs) {
   $csv .= "\n" if $csv;
   my ($name, $books) = ($1, $2);
   $csv .= csvEncode(xmlDecode($name));
   while ($books =~ /<book.*?>(.*?)<\/book.*?>/gs) {
      $csv .= "," . csvEncode(xmlDecode($1));
   }
}

print "Content-type: text/plain\n\n";
print $csv;
exit 0;

sub csvEncode {
   my $result = shift;
   $result =~ s/"/""/gs;
   "\"$result\"";
}

sub xmlDecode {
   my $result = shift;
   $result =~ s/&lt;/</gsi;
   $result =~ s/&gt;/>/gsi;
   $result =~ s/&quot;/"/gsi;
   $result =~ s/&apos;/'/gsi;
   $result =~ s/&amp;/&/gsi;
   $result;
}   #   xmldecode

(3)

(a) False
(b) False
(c) False
(d) False
(e) True

(4)

(a) No error.

(b) For example,

<xsd:simpleType name="OddNumber">
<xsd:restriction base="xsd:string">
<xsd:pattern value="-?(1|3|5|7|9|([1-9][0-9]*[13579]))"/>
</xsd:restriction>
< /xsd:simpleType>

(c) For example,

System.out.print(a.getFirstChild().getFirstChild().getNodeValue());