XPath 解析xml文档简单实用例子

简单的GUI Xpath 使用例子

XPth 表达式使用"/"来区分层节点次关系,比如/repository/properties

如果当前几点下面有多个子几点可以通过 [i] 来获取第几个节点:/repository/properties/property[2]

当然也可以直接获取当前节点下面的所有节点

可以通过@获取属性值 /repository/properties/property[2]/@value

详细XPath 参考:点击打开链接 或者 点击打开链接

在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();
		}
	}
}

 
 


 

猜你喜欢

转载自blog.csdn.net/wbxx727124/article/details/50775701