📄 xpathframe.java
字号:
package 十二.src;
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.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 {
public XPathFrame(){
setTitle("XPathTest");
JMenu fileMenu = new JMenu("File");// 添加了菜单按钮
//JMenuItem 实现了 JMenu 这个接口
JMenuItem openItem = new JMenuItem("open");
openItem.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){openFile();}});
fileMenu.add(openItem);
// JMenu editMenu = new JMenu("Edit");
// JMenuItem closeItem = new JMenuItem("close");
// closeItem.addActionListener(new ActionListener(){public void actionPerformed1{ActionEvent event1}{closeFile();}});
// editMenu.add(closeItem);
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
setJMenuBar(menuBar);
// ActionListener listener1 = new ActionListener(){
// public void actionPerformed1(ActionEvent event1){ System.out.println("实现actionPerformed");}};
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){ evaluate();}};
expression = new JTextField(28);
expression.addActionListener(listener);
JButton evaluateButton = new JButton("Evaluate");
evaluateButton.addActionListener(listener);
typeCombo = new JComboBox(new Object[]{"STRING","NODE","NODESET","NUMBER","BOOLEAN"});
//设置默认的显示
typeCombo.setSelectedItem("NODE");
JPanel panel = new JPanel();
panel.add(expression);
panel.add(typeCombo);
panel.add(evaluateButton);
docText = new JTextArea(15,50);
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();
}
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();
System.out.println(f.length());//返回文件的大小;这个值具体是什么不太清楚,与文件,右键/大小一致
try {
byte[] bytes = new byte[(int) f.length()];
//FileInputStream将文件f的内容存储到字节数组bytes中
//将控制符当成字节来对待,一同存储
new FileInputStream(f).read(bytes);
//通过bytes来生成字符串,字符串中包含控制符
//当显示在Text中时,控制符起作用(这也就是我们所看到的整齐的输入)
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 closeFile() {
System.out.println("测试关闭文件");
}
public void evaluate() {
try {
String typeName = (String) typeCombo.getSelectedItem();
QName returnType = (QName) XPathConstants.class.getField(typeName)
.get(null);
//expression.getText();就是字符串类型。学习的时候应该灵活学习。灵活的使用
Object evalResult = path.evaluate(expression.getText(), doc,
returnType);
if (typeName.equals("NODESET")) {
NodeList list = (NodeList) evalResult;
//StringBuilder的使用,见文档
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) {
e.printStackTrace();
}
}
private DocumentBuilder builder;
private Document doc;
private XPath path;
private JTextField expression;
private JTextField result;
private JTextArea docText;
private JComboBox typeCombo;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -