简单的GUI Xpath 使用例子
XPth 表达式使用"/"来区分层节点次关系,比如/repository/properties
如果当前几点下面有多个子几点可以通过 [i] 来获取第几个节点:/repository/properties/property[2]
当然也可以直接获取当前节点下面的所有节点
可以通过@获取属性值 /repository/properties/property[2]/@value
在JAVA SE5中提供了一个 API 用来计算 XPath 表达式
XPathFactory xp = XPathFactory.newInstance();
XPath path = xp.newXPath();
String p = path.evaluate("/repository/properties/property[2]/@value",doc);
上面的返回值将会一个字符串,如果要对检索对象做返回值限制 可以在evaluate添加第三个参数 XPathConstants常量
XPathConstants.NODESET ,产生一组节点时使用
XPathConstants.NODE,产生一个节点时
XPathConstants.NUMBER ,产生一个数字时
XPathConstants.BOOLEAN ,布尔值时
XPathConstants.STRING ,字符串时
.....
示列xml
<repository name='Bundle pool' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'> <properties size='2'> <property name='p2.system' value='true'/> <property name='p2.timestamp' value='1393239943836'/> </properties> <mappings size='3'> <rule filter='(& (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/> <rule filter='(& (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/> <rule filter='(& (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/> </mappings> </repository>
程序代码
package com.test; import java.awt.EventQueue; import javax.swing.JFrame; public class XPathTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new XPathFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } }
<pre class="java" name="code">package com.test; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import javax.swing.filechooser.FileFilter; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XPathFrame extends JFrame { /** * */ private static final long serialVersionUID = 6680692674157790281L; public XPathFrame() { //设置窗口名称 setTitle("XPath简单例子"); //创建菜单 JMenu fileMenu = new JMenu("文件"); //创建一个菜单项 JMenuItem openItem = new JMenuItem("打开"); //为菜单项绑定一个监听事件 openItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { openFile(); } }); //将菜单项添加到菜单中 fileMenu.add(openItem); JMenuItem exitItem = new JMenuItem("退出"); exitItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); fileMenu.add(exitItem); JMenuBar menuBar = new JMenuBar(); menuBar.add(fileMenu); setJMenuBar(menuBar); ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { evaluate(); } }; expr = new JTextField(30); expr.addActionListener(listener); //按钮 JButton evaluateButton = new JButton("查询"); evaluateButton.addActionListener(listener); //创建一个下拉框select typeCombo = new JComboBox(new Object[]{"STRING","NODE","NODESET","NUMBER","BOOLEAN"}); //为下拉框设置一个默认值 typeCombo.setSelectedItem("STRING"); JPanel panel = new JPanel(); panel.add(expr); 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{ //创建一个 DocumentBuilder 对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); }catch(ParserConfigurationException e){ JOptionPane.showConfirmDialog(this, e); } //取得 XPath 对象 XPathFactory xpathFactory = XPathFactory.newInstance(); path = xpathFactory.newXPath(); pack(); } private DocumentBuilder builder; private Document doc; private XPath path; private JTextField expr; private JTextField result; private JTextArea docText; private JComboBox typeCombo; /** * 打开文件 */ protected void openFile() { JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(".")); chooser.setFileFilter(new FileFilter(){ @Override public boolean accept(File f) { //对文件筛选 return f.isDirectory()||f.getName().toLowerCase().endsWith(".xml"); } @Override public String getDescription() { return "XML file"; } }); int r = chooser.showOpenDialog(this); if(r != JFileChooser.APPROVE_OPTION){ return; } File f = chooser.getSelectedFile(); try{ //获取文件xml流对象 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); } } /** * XPath 解析 */ public void evaluate() { try{ String typeName = (String)typeCombo.getSelectedItem(); QName returnType = (QName)XPathConstants.class.getField(typeName).get(null); //进行XPath表达式查询 Object evalResult = path.evaluate(expr.getText(), doc, returnType); if(typeName.equals("NODESET")){ NodeList list = (NodeList) evalResult; StringBuffer buffer = new StringBuffer(); buffer.append("{"); for(int i = 0;i < list.getLength();i++){ if(i > 0){ buffer.append("."); } buffer.append("" + list.item(i)); } buffer.append("}"); result.setText("" + buffer); } else{ result.setText("" + evalResult); } }catch(XPathExpressionException e){ result.setText("" + e); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }