Jump to content

XML - Managing Data Exchange/Parsing XML files/Answers

From Wikibooks, open books for an open world

This java class file is associated with the movies.xml file used in the 
chapter. Place this java file and movies.xml in the same directory. 
After compiling, this needs to be run from a command window and the format is:

> java SPParser movies.xml


import javax.xml.parsers.*;
import org.xml.sax.*;
import org.w3c.dom.*;
import java.io.*;

public class SPParser
{

  static Document doc;


  public SPParser(String filename)
  {
    //filename S/B the name of the XML file to parse
    File file = new File(filename);
    try
    {

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

      DocumentBuilder parser = factory.newDocumentBuilder();

      doc = parser.parse(file);

      System.out.println(file + " is well-formed.");
    }
    catch (SAXException e)
    {
      System.out.println( e.getMessage());
    }
    catch (IOException e)
    {
      System.out.println( e.getMessage());
    }
    catch (ParserConfigurationException e)
    {
      System.out.println("Could not locate a JAXP parser");
    }
  }


  public void readData(Node n)
  {
    System.out.println("Printing data and attributes");

    NamedNodeMap attributes = n.getAttributes();
    String strAttributes = "Production Company- '" + attributes.item(0).getNodeValue();

    if (attributes.getLength() == 2) //There are two attributes in the movies.xml file
      strAttributes += "' , Loaned To - '" + attributes.item(1).getNodeValue() + "' ,";
    else
      strAttributes += "' , Not out , ";

    NodeList values = n.getChildNodes();

    String dataString = "Movies Data:  " + strAttributes;
    int ancestor = 0;

    for (int i = 0; i < values.getLength(); i++)
    {
      Node child = values.item(i);

      if (child.getNodeType() != Node.TEXT_NODE)
      {
        String insert = child.getFirstChild().getNodeValue();

        if (insert.trim().length() != 0 && ancestor == 0)
        {
          dataString += "Movie Title - '"+insert+"', ";
          ancestor = 1;
        }
        else if (insert.trim().length() != 0  && ancestor == 1)
        {
          dataString += "Director - '"+insert+"'.";
          ancestor = 0;
        }
      }
    }//End of for-loop

    System.out.println(dataString);
    System.out.println();
  }//End of insertStatements()

  public static void main(String[] args)
  {
    SPParser p = new SPParser("movies.xml");

    NodeList n = doc.getElementsByTagName("movie");

    for (int i = 0; i < n.getLength(); i++)
    {
      p.readData(n.item(i));
    }
  }//End of main()

}//End of SPParser class