最近一直在忙实验室的一个项目, 看之前的实现代码看了好久..
前段时间需要用xpath访问xml文件, 于是就上网搜了下, 写了个工具类.
主要参考网址: http://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
介绍挺全面的.
比如说xml代码如下:
<root>
<node name="no1">
<node>
testnode
</node>
</node>
<node>
<name>no2</name>
</node>
</root>
首先说说xpath的写法:
如果我要取所有的node
"//node"
具体用法上网查查吧.
时间有些匆忙=.=内容以后补充吧
工具类如下:
import java.io.IOException;
import java.util.Iterator;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
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.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
/**
* 利用XPath解析xml文件(针对AndroidManifest.xml)
*
* @author Ypy
*
*/
public class ParserXML {
private static XPath xpath = XPathFactory.newInstance().newXPath();
/**
* 找到与XPath相对应的xml节点项
*
* @param xml文件的路径
* @param XPath表达式
* @param 解析后要返回的类型
* @return 返回对应returnType类型的object
*/
public static Object parser(String filename, String exp, QName returnType) {
Object obj = null;
try {
Document doc = getDoc(filename);
xpath.setNamespaceContext(new PersonNamespaceContext());
XPathExpression expr = xpath.compile(exp);
obj = expr.evaluate(doc, returnType);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
return obj;
}
/**
* 根据filename创建的Document对象
*
* @param filename
* 要解析的xml文件路径
* @return Document对象
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
private static Document getDoc(String filename)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(filename);
return doc;
}
}
/**
* 命名空间, 因为AndroidManifest.xml文件节点的属性是"android:***"的形式
* 使用了"http://schemas.android.com/apk/res/android"的命名空间 所以要对android前缀进行解析.
*
* @author Ypy
*
*/
class PersonNamespaceContext implements NamespaceContext {
@Override
public String getNamespaceURI(String prefix) {
if (prefix == null)
throw new NullPointerException("null prefix");
else if ("android".equals(prefix))
return "http://schemas.android.com/apk/res/android";
else if ("xml".equals(prefix))
return XMLConstants.XML_NS_URI;
return XMLConstants.NULL_NS_URI;
}
@Override
public String getPrefix(String namespaceURI) {
return null;
}
@SuppressWarnings("unchecked")
@Override
public Iterator getPrefixes(String namespaceURI) {
return null;
}
}