前文《JDOM操作XML文件》发表后很多网友反响不错~但是没有包含搜索查询单一功能。
今天,补充一下。
对XML的内容做查询,比较传统的方法是遍历,但是,这种原始的方法,在遇到太多子节点(>5层)的时候
效率就是问题了~~所以,法老这次采用的是使用JDOM和XPATH结合查询的办法。
原文地址:http://blog.csdn.net/pharaohsprince/archive/2006/01/12/577344.aspx
代码片段如下:
/**
* 搜索XML文件信息
*/
public Vector SelXML(HttpServletRequest request) throws Exception {
Vector xmlVector = null;
FileInputStream fi = null;
XmlBean findxml = null;
try {
request.setCharacterEncoding("GBK");// 内码转换
String bookname = request.getParameter("bookname");
String path = request.getParameter("path");
fi = new FileInputStream(path);
xmlVector = new Vector();
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(fi);
Element root = doc.getRootElement();
XPath xpath = XPath.newInstance("//书//书名[text()='"+bookname+"']");
/**
* 查询出记录
*/
List find = xpath.selectNodes(root);
Iterator iter = find.iterator();
while (iter.hasNext()) {
Element item = (Element) iter.next();
Element itemparent = item.getParentElement();//得到其父节点
// System.err.println(item.getText());
// System.err.println("ID:"+itemparent.getAttributeValue("id"));
// System.err.println("书名:"+itemparent.getChild("书名").getText());
// System.err.println("作者:"+itemparent.getChild("作者").getText());
// System.err.println("--------------");
findxml = new XmlBean();
findxml.setbookname(itemparent.getChild("书名").getText());
findxml.setauthor(itemparent.getChild("作者").getText());
findxml.setpub(itemparent.getChild("出版社").getText());
findxml.setprice(itemparent.getChild("价格").getText());
findxml.setpubdate(itemparent.getChild("出版日期").getText());
xmlVector.add(findxml);
}
} catch (Exception e) {
System.err.println(e + "error");
} finally {
try {
fi.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return xmlVector;
}
test.jsp中增加的代码
<form method="POST" action="xmlaction.jsp">
<p align="center"><br>
书 名:<input type="text" name="bookname" size="20"><input type="hidden" name="act" value="search"><br>
</p>
<input type="hidden" name="path" value="<%=path%>">
<p align="center"><input type="submit" value="查询" name="B1">
<input
type="reset" value="重置" name="B2"></p>
</form>
xmlaction.jsp 中增加的代码
else if (request.getParameter("act") != null
&& request.getParameter("act").equals("search")) {
XmlBean xml = new XmlBean();
Vector selxml = xml.SelXML(request);
out.println("查询结果:"+selxml.size()+"条记录<br>-------------------<br>");
for (int i = 0; i < selxml.size(); i++) {
xml = (XmlBean) selxml.elementAt(i);
out.println("书名:"+xml.getbookname()+"<br>");
out.println("作者:"+xml.getauthor()+"<br>");
out.println("出版社:"+xml.getpub()+"<br>");
out.println("价格:"+xml.getprice()+"<br>");
out.println("出版日期:"+xml.getpubdate()+"<br><br>");
}
out.println("<p align='center'><br><br>查询成功<br><br><a href='test.jsp'>返回</a>");
}