1  import java.io.File;
  2  import java.io.IOException;
  3  import java.util.ArrayList;
  4  import javax.xml.parsers.DocumentBuilder;
  5  import javax.xml.parsers.DocumentBuilderFactory;
  6  import javax.xml.parsers.ParserConfigurationException;
  7  import javax.xml.xpath.XPath;
  8  import javax.xml.xpath.XPathExpressionException;
  9  import javax.xml.xpath.XPathFactory;
 10  import org.w3c.dom.Document;
 11  import org.xml.sax.SAXException;
 12  
 13  /**
 14     An XML parser for item lists
 15  */
 16  public class ItemListParser
 17  {
 18     private DocumentBuilder builder;
 19     private XPath path;
 20  
 21     /**
 22        Constructs a parser that can parse item lists.
 23     */
 24     public ItemListParser() 
 25           throws ParserConfigurationException
 26     {
 27        DocumentBuilderFactory dbfactory 
 28              = DocumentBuilderFactory.newInstance();
 29        builder = dbfactory.newDocumentBuilder();
 30        XPathFactory xpfactory = XPathFactory.newInstance();
 31        path = xpfactory.newXPath();
 32     }
 33  
 34     /**
 35        Parses an XML file containing an item list.
 36        @param fileName the name of the file
 37        @return an array list containing all items in the XML file
 38     */
 39     public ArrayList<LineItem> parse(String fileName) 
 40        throws SAXException, IOException, XPathExpressionException
 41     {
 42        File f = new File(fileName);
 43        Document doc = builder.parse(f);
 44  
 45        ArrayList<LineItem> items = new ArrayList<LineItem>();
 46        int itemCount = Integer.parseInt(path.evaluate(
 47              "count(/items/item)", doc));
 48        for (int i = 1; i <= itemCount; i++)
 49        {
 50           String description = path.evaluate(
 51                 "/items/item[" + i + "]/product/description", doc);
 52           double price = Double.parseDouble(path.evaluate(
 53                 "/items/item[" + i + "]/product/price", doc));
 54           Product pr = new Product(description, price);
 55           int quantity = Integer.parseInt(path.evaluate(
 56                 "/items/item[" + i + "]/quantity", doc));
 57           LineItem it = new LineItem(pr, quantity);
 58           items.add(it);
 59        }
 60        return items;
 61     }
 62  }
 63  
 64  
 65  
 66  
 67  
 68  
 69  
 70  
 71