XPath获取XML指定节点属性值的两种方法

前面有文章介绍了通过XPath解析xml报文的方法,今天工作中遇到了需要解析指定节点属性值的问题,现在总结一下,下面提供两种方法去获取属性值。

首先是xml结构:

1.<?xml version="1.0" encoding="utf-8" ?>

2.<bookstore>

3. <book>

4. <title lang="en1">Everyday Italian</title>

5. <author>Giada De Laurentiis</author>

6. <year>2005</year>

7. <price>30.00</price>

8.</book>

9.<book>

10.<title lang="en2">Harry Potter</title>

11.<author>J K. Rowling</author>

12. <year>2005</year>

13. <price>29.99</price>

14.</book>

15. <book>

16. <title lang="en3">Learning XML</title>

17. <author>Erik T. Ray</author>

18.<year>2003</year>

19.<price>39.95</price>

20. </book>

21.</bookstore>

解析代码:

1.import org.w3c.dom.Document;

2.import org.w3c.dom.Node;

3.import org.w3c.dom.NodeList;

4.import org.xml.sax.SAXException;

5.

6.import javax.xml.parsers.DocumentBuilderFactory;

7.import javax.xml.parsers.ParserConfigurationException;

8.import javax.xml.transform.Transformer;

9.import javax.xml.transform.TransformerException;

10.import javax.xml.transform.TransformerFactory;

11.import javax.xml.transform.dom.DOMSource;

12.import javax.xml.transform.stream.StreamResult;

13.import javax.xml.xpath.XPath;

14import javax.xml.xpath.XPathConstants;

15.import javax.xml.xpath.XPathFactory;

16.import java.io.*;

17.

18./**

19.* Created by hasee on 2017/2/14.

20. * liqinghe

21. * 获取xml指定节点属性值

22. */

23.public class PropertyValueTest {

24.

25. public static void main(String[] args) throws Exception {

26. //XML文档路径

27. String xmlUrl = "D:\\FTP\\测试XML\\book.xml";

28. //需要获取的节点属性值位置

29. String propertyUrl = "bookstore/book/title";

30. String propertyName = "lang";

31. Document document = getXmlDocument(xmlUrl);

32. //获取该位置的节点集合

33. NodeList nodeList = nodeList(propertyUrl, document);

34.

35. //第一种方法 node直接获取

36. for (int i = 0; i < nodeList.getLength(); i++) {

37. Node node = nodeList.item(i);

38. Node attr = node.getAttributes().getNamedItem(propertyName);

39. String propertyValue = attr.getNodeValue(); //属性值

40. System.out.println(propertyValue);

41. }

42.

43. //第二种方法 用xpath获取

44. for (int i = 0; i < nodeList.getLength(); i++) {

45. Node node = nodeList.item(i);

46. //将node对象转成string字符串

47. String nodeString = NodetoString(node);

48. Document document1 =stringDoc(nodeString);

49. //注意需要用到@符号

50. String path = "title"+"/@"+propertyName;

51. String propertyValue = propertyValue(path,document1); //属性值

52. System.out.println(propertyValue);

53. }

54. }

55.

56. /**

57. * 根据xml文档路径生成Document对象

58. *

59. * @param xmlFilePath XML文档路径

60. * @return Document

61. */

62. public static Document getXmlDocument(String xmlFilePath) {

63. Document doc = null;

64. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

65. dbf.setNamespaceAware(true);

66. try {

67. doc = dbf.newDocumentBuilder().parse(new FileInputStream(xmlFilePath));

68. } catch (ParserConfigurationException ex) {

69. ex.printStackTrace();

70. } catch (FileNotFoundException ex) {

71. ex.printStackTrace();

72. } catch (SAXException ex) {

73. ex.printStackTrace();

74. } catch (IOException ex) {

75. ex.printStackTrace();

76. }

77. return doc;

78. }

79.

80. /**

81. * 获取节点集合

82. *

83. * @param path 节点位置 head/MessageID

84. * @param document

85. * @return

86. */

87. public static NodeList nodeList(String path, Node document) {

88. NodeList nodeList = null;

89. try {

90. // 生成XPath对象

91. XPath xpath = XPathFactory.newInstance().newXPath();

92. // 获取节点值

93. nodeList = (NodeList) xpath.evaluate(

94. path, document,

95. XPathConstants.NODESET);

96. } catch (Exception e) {

97. }

98. return nodeList;

99. }

100.

101.

102. /**

103. * string 转换成 doc

104. * @param docStr

105 * @return

106. * @throws Exception

107. */

108. public static Document stringDoc(String docStr) throws Exception {

109. InputStream is = new ByteArrayInputStream(docStr.getBytes());

110. Document doc = null;

111. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

112. dbf.setNamespaceAware(true);

113. try {

114. doc = dbf.newDocumentBuilder().parse(is);

115. } catch (ParserConfigurationException ex) {

116. ex.printStackTrace();

117. } catch (FileNotFoundException ex) {

118. ex.printStackTrace();

119. } catch (SAXException ex) {

120. ex.printStackTrace();

121. } catch (IOException ex) {

122. ex.printStackTrace();

123. }

124. return doc;

125. }

126.

127. /**

128. * 获取节点属性值

129. * @param path 节点属性值位置 head/@propertyName

130. * @param node xml对象

131. * @return

132. */

133. public static String propertyValue(String path, Node node) {

134. String nodeValue = "";

135. try {

136. // 生成XPath对象

137. XPath xpath = XPathFactory.newInstance().newXPath();

138. // 获取节点值

139. nodeValue = (String) xpath.evaluate(

140. path, node,

141. XPathConstants.STRING);

142. } catch (Exception e) {

143. }

145. return nodeValue;

146. }

147.

148. /**

149. * 将传入的一个DOM Node对象输出成字符串。如果失败则返回一个空字符串""。

150. *

151. * @param node DOM Node 对象。

152. * @return a XML String from node

153. */

154. public static String NodetoString(Node node) {

155. Transformer transformer = null;

156. String result = null;

157. if (node == null) {

158. throw new IllegalArgumentException();

159. }

160. try {

161. transformer = TransformerFactory.newInstance().newTransformer();

162. } catch (Exception e) {

163. throw new RuntimeException(e.getMessage());

164. }

165. if (transformer != null) {

166. try {

167. StringWriter sw = new StringWriter();

168. transformer.transform(new DOMSource(node), new StreamResult(sw));

169. return sw.toString();

170. } catch (TransformerException te) {

171. throw new RuntimeException(te.getMessage());

172. }

173. }

174. return result;

175. }

176.}

代码注释写得很清楚了,注意所用的Document是 w3c下面的。

运行结果:

1.en1

2.en2

3.en3

4.en1

5.0en2

6.en3

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容