Mega Code Archive

 
Categories / Java / XML
 

This program evaluates XPath expressions

/*    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>