简单的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();
}
}
}