用XPath解析XML文件
一、XPath
XPath 是一门在 XML 文档中查找信息的语言, 可用来在 XML 文档中对元素和属性进行遍历。
XPath表达式比繁琐的文档对象模型(DOM)代码要容易编写得多。如果需要从XML文档中提取信息,最快捷、最简单的办法就是在Java程序中嵌入XPath表达式。在Java版本中推出了javax.xml.xpath包,这是一个用于XPath文档查询的独立于XML对象模型的库。
二、XPath API
1.XPathFactory类
XPathFactory实例可用于创建XPath对象。该类只有一个受保护的空构造方法,常用的方法是:
static XPathFactory newInstance( ):获取使用默认对象模型(DOM)的新XPathFactory 实例。
2. XPath 接口
提供了对XPath计算环境和表达式的访问。XPath对象不是线程安全的,也不能重复载入。也就是说应用程序负责确保在任意给定时间内不能有多个线程使用一个XPath对象。
常用方法 :
XPathExpression compile(String expression):编译XPath表达式。
3 XPath.evaluate()
1)XPath.evaluate(String expression, InputSource source, QName returnType) :计算指定 InputSource 上下文中的 XPath 表达式并返回指定类型的结果。
2)XPath.evaluate(String expression, Object item, QName returnType) : 计算指定上下文中的 XPath 表达式并返回指定类型的结果。
其中第三个参数就是用于指定需要的返回类型,该参数的值都是在XPathConstants中已经命名的静态字段。如下:
XPathConstants.BOOLEAN
XPathConstants.NODESET
XPathConstants.NUMBER
XPathConstants.STRING
XPathConstants.STRING
XPathConstants.NODE
注:XPathConstants.NODE它主要适用于当XPath表达式的结果有且只有一个节点。如果XPath表达式返回了多个节点,却指定类型为XPathConstants.NODE,则evaluate()方法将按照文档顺序返回第一个节点。如果XPath表达式的结果为一个空集,却指定类型为XPathConstants.NODE,则evaluate( )方法将返回null。
三、java代码实现
1.xml文件
<location>
<property>
<name>city</name>
<value>beijing</value>
</property>
<property>
<name>district</name>
<value>chaoyang</value>
</property>
</location>
2.解析上面的xml文件
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XPathTest {
public static void main(String args[]){
try {
//解析文档
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("city.xml");
XPathFactory factory = XPathFactory.newInstance(); //创建 XPathFactory
XPath xpath = factory.newXPath();//用这个工厂创建 XPath 对象
NodeList nodes = (NodeList)xpath.evaluate("location/property", doc, XPathConstants.NODESET);
String name = "";
String value = "";
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
name = (String) xpath.evaluate("name", node, XPathConstants.STRING);
value = (String) xpath.evaluate("value", node, XPathConstants.STRING);
System.out.println("name="+name+";value="+value);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
name=city;value=beijing
name=district;value=chaoyang