Stax处理XML(二)——基于迭代模型的查找和过滤器的使用

前端之家收集整理的这篇文章主要介绍了Stax处理XML(二)——基于迭代模型的查找和过滤器的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Stax处理XML,基于迭代模型的查找,关键在于:

使用XMLInputFactory创建XMLEventReader,获取了eventReader之后,(在while循环hasNext中)通过XMLEvent来获取是否是某种节点类型,通过event.asxxx转换节点。

(1)测试一:基于迭代模型的查找

@H_301_12@ /** * 基于迭代模型的查找 */ @Test public void test04() { XMLInputFactory factory = XMLInputFactory.newInstance(); InputStream is = null; try { is = TestStax.class.getClassLoader().getResourceAsStream("books.xml"); //基于迭代模型的操作方式 XMLEventReader reader = factory.createXMLEventReader(is); int num = 0; while(reader.hasNext()) { //通过XMLEvent来获取是否是某种节点类型 XMLEvent event = reader.nextEvent(); if (event.isStartElement()) { //通过event.asxxx转换节点 String name = event.asStartElement().getName().toString(); if (name.equals("title")) { System.out.print(reader.getElementText() + ": "); } if (name.equals("price")) { System.out.print(reader.getElementText() + "\n"); } } num++; } System.out.println(num); } catch (XMLStreamException e) { e.printStackTrace(); } finally { try { if(is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } } }


输出结果:

Everyday Italian: 30.00
Harry Potter: 29.99
XQuery Kick Start: 49.99
Learning XML: 39.95
85

(2)测试二:基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,然后while只在eventFilter返回的结果集中循环,减少循环次数、提高效率。

  1. /**
  2. * 过滤器的使用
  3. */
  4. @Test
  5. public void test05() {
  6. XMLInputFactory factory = XMLInputFactory.newInstance();
  7. InputStream is = null;
  8. try {
  9. is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
  10. //基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,效率会高一些
  11. XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),new EventFilter() {
  12. @Override
  13. public boolean accept(XMLEvent event) {
  14. //返回true表示会显示,返回false表示不显示
  15. if(event.isStartElement()) {
  16. String name = event.asStartElement().getName().toString();
  17. //eventReader结果集中只显示标题和价格
  18. if (("title").equals(name) || ("price").equals(name))
  19. return true;
  20. }
  21. return false;
  22. }
  23. });
  24. int num = 0;
  25. //while只在eventFilter返回的结果集中循环
  26. while(reader.hasNext()) {
  27. //通过XMLEvent来获取是否是某种节点类型
  28. XMLEvent event = reader.nextEvent();
  29. if (event.isStartElement()) {
  30. //通过event.asxxx转换节点
  31. String name = event.asStartElement().getName().toString();
  32. if (name.equals("title")) {
  33. System.out.print(reader.getElementText() + ": ");
  34. }
  35. if (name.equals("price")) {
  36. System.out.print(reader.getElementText() + "\n");
  37. }
  38. }
  39. num++;
  40. }
  41. System.out.println(num);
  42. } catch (XMLStreamException e) {
  43. e.printStackTrace();
  44. } finally {
  45. try {
  46. if(is != null) is.close();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }


输出结果: Everyday Italian: 30.00 Harry Potter: 29.99 XQuery Kick Start: 49.99 Learning XML: 39.95 8

猜你在找的XML相关文章