XPathTest.java Source code

Java tutorial

Introduction

Here is the source code for XPathTest.java

Source

    /*
       This program is a part of the companion code for Core Java 8th ed.
       (http://horstmann.com/corejava)
    
       This program is free software: you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published by
       the Free Software Foundation, either version 3 of the License, or
       (at your option) any later version.
    
       This program is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       GNU General Public License for more details.
    
       You should have received a copy of the GNU General Public License
       along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */

    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.xml.namespace.*;
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;
    import org.w3c.dom.*;
    import org.xml.sax.*;

    /**
     * This program evaluates XPath expressions
     * @version 1.01 2007-06-25
     * @author Cay Horstmann
     */
    public class XPathTest {
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new XPathFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
        }
    }

    /**
     * This frame shows an XML document, a panel to type an XPath expression, and a text field to
     * display the result.
     */
    class XPathFrame extends JFrame {
        public XPathFrame() {
            setTitle("XPathTest");

            JMenu fileMenu = new JMenu("File");
            JMenuItem openItem = new JMenuItem("Open");
            openItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    openFile();
                }
            });
            fileMenu.add(openItem);

            JMenuItem exitItem = new JMenuItem("Exit");
            exitItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    System.exit(0);
                }
            });
            fileMenu.add(exitItem);

            JMenuBar menuBar = new JMenuBar();
            menuBar.add(fileMenu);
            setJMenuBar(menuBar);

            ActionListener listener = new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    evaluate();
                }
            };
            expression = new JTextField(20);
            expression.addActionListener(listener);
            JButton evaluateButton = new JButton("Evaluate");
            evaluateButton.addActionListener(listener);

            typeCombo = new JComboBox(new Object[] { "STRING", "NODE", "NODESET", "NUMBER", "BOOLEAN" });
            typeCombo.setSelectedItem("STRING");

            JPanel panel = new JPanel();
            panel.add(expression);
            panel.add(typeCombo);
            panel.add(evaluateButton);
            docText = new JTextArea(10, 40);
            result = new JTextField();
            result.setBorder(new TitledBorder("Result"));

            add(panel, BorderLayout.NORTH);
            add(new JScrollPane(docText), BorderLayout.CENTER);
            add(result, BorderLayout.SOUTH);

            try {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                builder = factory.newDocumentBuilder();
            } catch (ParserConfigurationException e) {
                JOptionPane.showMessageDialog(this, e);
            }

            XPathFactory xpfactory = XPathFactory.newInstance();
            path = xpfactory.newXPath();
            pack();
        }

        /**
         * Open a file and load the document.
         */
        public void openFile() {
            JFileChooser chooser = new JFileChooser();
            chooser.setCurrentDirectory(new File("."));

            chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
                public boolean accept(File f) {
                    return f.isDirectory() || f.getName().toLowerCase().endsWith(".xml");
                }

                public String getDescription() {
                    return "XML files";
                }
            });
            int r = chooser.showOpenDialog(this);
            if (r != JFileChooser.APPROVE_OPTION)
                return;
            File f = chooser.getSelectedFile();
            try {
                byte[] bytes = new byte[(int) f.length()];
                new FileInputStream(f).read(bytes);
                docText.setText(new String(bytes));
                doc = builder.parse(f);
            } catch (IOException e) {
                JOptionPane.showMessageDialog(this, e);
            } catch (SAXException e) {
                JOptionPane.showMessageDialog(this, e);
            }
        }

        public void evaluate() {
            try {
                String typeName = (String) typeCombo.getSelectedItem();
                QName returnType = (QName) XPathConstants.class.getField(typeName).get(null);
                Object evalResult = path.evaluate(expression.getText(), doc, returnType);
                if (typeName.equals("NODESET")) {
                    NodeList list = (NodeList) evalResult;
                    StringBuilder builder = new StringBuilder();
                    builder.append("{");
                    for (int i = 0; i < list.getLength(); i++) {
                        if (i > 0)
                            builder.append(", ");
                        builder.append("" + list.item(i));
                    }
                    builder.append("}");
                    result.setText("" + builder);
                } else
                    result.setText("" + evalResult);
            } catch (XPathExpressionException e) {
                result.setText("" + e);
            } catch (Exception e) // reflection exception
            {
                e.printStackTrace();
            }
        }

        private DocumentBuilder builder;
        private Document doc;
        private XPath path;
        private JTextField expression;
        private JTextField result;
        private JTextArea docText;
   private JComboBox typeCombo;
}

    //gridbag.dtd

    <!ELEMENT gridbag (row)*>
<!ELEMENT row (cell)*>
<!ELEMENT cell (bean)>
<!ATTLIST cell gridx CDATA #IMPLIED>
<!ATTLIST cell gridy CDATA #IMPLIED>
<!ATTLIST cell gridwidth CDATA "1">
<!ATTLIST cell gridheight CDATA "1">
<!ATTLIST cell weightx CDATA "0">
<!ATTLIST cell weighty CDATA "0">
<!ATTLIST cell fill (NONE|BOTH|HORIZONTAL|VERTICAL) "NONE">
<!ATTLIST cell anchor 
   (CENTER|NORTH|NORTHEAST|EAST|SOUTHEAST|SOUTH|SOUTHWEST|WEST|NORTHWEST) "CENTER">
<!ATTLIST cell ipadx CDATA "0">
<!ATTLIST cell ipady CDATA "0">

<!ELEMENT bean (class, property*)>
<!ATTLIST bean id ID #IMPLIED>

<!ELEMENT class (#PCDATA)>
<!ELEMENT property (name, value)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT value (int|string|boolean|bean)>
<!ELEMENT int (#PCDATA)>
<!ELEMENT string (#PCDATA)>
<!ELEMENT boolean (#PCDATA)>


//File fontdialog.xml
<?xml version="1.0"?>
<!DOCTYPE gridbag SYSTEM "gridbag.dtd">
<gridbag>
   <row>
      <cell anchor="EAST">
         <bean>
            <class>javax.swing.JLabel</class>
            <property>
               <name>text</name>
               <value><string>Face: </string></value>
            </property>
         </bean>
      </cell>
      <cell fill="HORIZONTAL" weightx="100">
         <bean id="face">
            <class>javax.swing.JComboBox</class>
         </bean>
      </cell>
      <cell gridheight="4" fill="BOTH" weightx="100" weighty="100">
         <bean id="sample">
            <class>javax.swing.JTextArea</class>
            <property>
               <name>text</name>
               <value><string>The quick brown fox jumps over the lazy dog</string></value>
            </property>
            <property>
               <name>editable</name>
               <value><boolean>false</boolean></value>
            </property>
            <property>
               <name>lineWrap</name>
               <value><boolean>true</boolean></value>
            </property>
            <property>
               <name>border</name>
               <value>
                  <bean>
                     <class>javax.swing.border.EtchedBorder</class>
                  </bean>
               </value>
            </property>
         </bean>
      </cell>
   </row>
   <row>
      <cell anchor="EAST">
         <bean>
            <class>javax.swing.JLabel</class>
            <property>
               <name>text</name>
               <value><string>Size: </string></value>
            </property>
         </bean>
      </cell>
      <cell fill="HORIZONTAL" weightx="100">
         <bean id="size">
            <class>javax.swing.JComboBox</class>
         </bean>
      </cell>
   </row>
   <row>
      <cell gridwidth="2" weighty="100">
         <bean id="bold">
            <class>javax.swing.JCheckBox</class>
            <property>
               <name>text</name>
               <value><string>Bold</string></value>
            </property>
         </bean>
      </cell>
   </row>
   <row>
      <cell gridwidth="2" weighty="100">
         <bean id="italic">
            <class>javax.swing.JCheckBox</class>
            <property>
               <name>text</name>
               <value><string>Italic</string></value>
            </property>
         </bean>
      </cell>
   </row>
</gridbag>