使用XPath的步骤
以下是使用XPath解析器在解析文档时使用的步骤。
-
导入XML相关的软件包。
-
创建DocumentBuilder
-
从文件或数据流创建一个文档
-
创建XPath对象和XPath的路径表达式
-
编译XPath表达式使用XPath.compile() ,并由XPath.evaluate()评估计算获得一个节点列表
-
遍历节点列表。
-
检查属性
-
检查子元素
导入XML相关的软件包
1
2
3
4
5
|
import org.w3c.dom.*; import org.xml.sax.*; import javax.xml.parsers.*; import javax.xml.xpath.*; import java.io.*; |
创建DocumentBuilder
1
2
3
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); |
从文件或数据流创建一个文档
1
2
3
4
5
|
StringBuilder xmlStringBuilder = new StringBuilder(); xmlStringBuilder.append( "<?xml version=" 1.0 "?> <class> </class>" ); ByteArrayInputStream input = new ByteArrayInputStream( xmlStringBuilder.toString().getBytes( "UTF-8" )); Document doc = builder.parse(input); |
构建XPath
1
|
XPath xPath = XPathFactory.newInstance().newXPath(); |
准备路径表达式,并计算它
1
2
|
String expression = "/class/student" ;
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); |
遍历节点列表
1
2
3
|
for ( int i = 0 ; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); ...} |
检查属性
1
2
3
4
|
//returns specific attribute getAttribute( "attributeName" ); //returns a Map (table) of names/values getAttributes(); |
检查子元素
1
2
3
4
|
//returns a list of subelements of specified name getElementsByTagName( "subelementName" ); //returns a list of all child nodes getChildNodes(); |
演示示例:
这里是我们需要分析输入文本文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<? xml version = "1.0" ?> < class > < student rollno = "393" > < firstname >dinkar</ firstname > < lastname >kad</ lastname > < nickname >dinkar</ nickname > < marks >85</ marks > </ student > < student rollno = "493" > < firstname >Vaneet</ firstname > < lastname >Gupta</ lastname > < nickname >vinni</ nickname > < marks >95</ marks > </ student > < student rollno = "593" > < firstname >jasvir</ firstname > < lastname >singh</ lastname > < nickname >jazz</ nickname > < marks >90</ marks > </ student > </ class > |
演示示例:
XPathParserDemo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package cn.sxt.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; 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.w3c.dom.Node; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class XPathParserDemo { public static void main(String[] args) { try { File inputFile = new File( "input.txt" ); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); String expression = "/class/student" ;
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); for ( int i = 0 ; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); System.out.println( "\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println( "Student roll no : " + eElement.getAttribute( "rollno" )); System.out.println( "First Name : " + eElement .getElementsByTagName( "firstname" ) .item( 0 ) .getTextContent()); System.out.println( "Last Name : " + eElement .getElementsByTagName( "lastname" ) .item( 0 ) .getTextContent()); System.out.println( "Nick Name : " + eElement .getElementsByTagName( "nickname" ) .item( 0 ) .getTextContent()); System.out.println( "Marks : " + eElement .getElementsByTagName( "marks" ) .item( 0 ) .getTextContent()); } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } } |
这将产生以下结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Current Element :student Student roll no : 393 First Name : dinkar Last Name : kad Nick Name : dinkar Marks : 85 Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95 Current Element :student Student roll no : 593 First Name : jasvir Last Name : singh Nick Name : jazz Marks : 90 |