Stax处理XML(三)——XPath的使用和写文档、修改文档

前端之家收集整理的这篇文章主要介绍了Stax处理XML(三)——XPath的使用和写文档、修改文档前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

(1)XPath的使用

前面讲了Stax处理XML的查找,有基于光标的查找,和基于迭代模型的查找。Stax也支持XPath查找。

  1. /**
  2. * XPath的使用
  3. * 查找category为WEB的bookList
  4. */
  5. @Test
  6. public void test06() {
  7. InputStream is = null;
  8. try {
  9. is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
  10. //创建文档处理对象
  11. DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
  12. //通过DocumentBuilder创建doc的文档对象
  13. Document doc = db.parse(is);
  14. //创建XPath对象
  15. XPath xpath = XPathFactory.newInstance().newXPath();
  16. //第一个参数是xpath,第二个参数是文档
  17. //查找category为WEB的bookList
  18. NodeList list = (NodeList)xpath.evaluate("//book[@category='WEB']",doc,XPathConstants.NODESET);
  19. for (int i = 0; i < list.getLength(); i++) {
  20. //遍历输出相应的结果
  21. Element el = (Element)list.item(i);
  22. System.out.println(el.getElementsByTagName("title").item(0).getTextContent());
  23. }
  24. } catch (ParserConfigurationException e) {
  25. e.printStackTrace();
  26. } catch (SAXException e) {
  27. e.printStackTrace();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. } catch (XPathExpressionException e) {
  31. e.printStackTrace();
  32. } finally {
  33. try {
  34. if (is != null) is.close();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }


输出结果:

XQuery Kick Start
Learning XML

(2)写文档:使用XMLStreamWriter创建xml

  1. /**
  2. * 使用XMLStreamWriter创建xml
  3. */
  4. @Test
  5. public void test07() {
  6. try {
  7. XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
  8. xsw.writeStartDocument("UTF-8","1.0");
  9. xsw.writeEndDocument();
  10. String ns = "http://11:dd";
  11. //三个参数分别是前缀、标签名、命名空间URI
  12. xsw.writeStartElement("ns","person",ns);
  13. xsw.writeStartElement(ns,"id");
  14. //xsw.writeStartElement("person");
  15. //xsw.writeStartElement("id");
  16. xsw.writeCharacters("1");
  17. xsw.writeEndElement();
  18. xsw.writeEndElement();
  19. xsw.flush();
  20. xsw.close();
  21. } catch (XMLStreamException e) {
  22. e.printStackTrace();
  23. } catch (FactoryConfigurationError e) {
  24. e.printStackTrace();
  25. }
  26. }


输出结果:

<?xml version="1.0" encoding="UTF-8"?><ns:person><ns:id>1</ns:id></ns:person>

去掉注释部分后的输出结果:

<?xml version="1.0" encoding="UTF-8"?><ns:person><ns:id><person><id>1</id></person>

(3)修改文档:使用Transformer更新节点信息

读取文档,修改部分,并打印出文档

  1. /**
  2. * 使用Transformer更新节点信息
  3. * 修改标题为Learning XML的书的价格为333.9
  4. */
  5. @Test
  6. public void test08() {
  7. InputStream is = null;
  8. try {
  9. is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
  10. //创建文档处理对象
  11. DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
  12. //通过DocumentBuilder创建doc的文档对象
  13. Document doc = db.parse(is);
  14. //创建XPath对象
  15. XPath xpath = XPathFactory.newInstance().newXPath();
  16. Transformer tran = TransformerFactory.newInstance().newTransformer();
  17. tran.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
  18. //设置第一行换行
  19. tran.setOutputProperty(OutputKeys.INDENT,"yes");
  20. //第一个参数是xpath,第二个参数是文档
  21. NodeList list = (NodeList)xpath.evaluate("//book[title='Learning XML']",XPathConstants.NODESET);
  22. //获取上面所查找书的price节点,并set
  23. Element be = (Element)list.item(0);
  24. Element el = (Element)(be.getElementsByTagName("price").item(0));
  25. el.setTextContent("333.9");
  26. //通过transformer修改节点
  27. Result result = new StreamResult(System.out);
  28. tran.transform(new DOMSource(doc),result);
  29. } catch (ParserConfigurationException e) {
  30. e.printStackTrace();
  31. } catch (SAXException e) {
  32. e.printStackTrace();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. } catch (XPathExpressionException e) {
  36. e.printStackTrace();
  37. } catch (TransformerConfigurationException e) {
  38. e.printStackTrace();
  39. } catch (TransformerFactoryConfigurationError e) {
  40. e.printStackTrace();
  41. } catch (TransformerException e) {
  42. e.printStackTrace();
  43. } finally {
  44. try {
  45. if (is != null) is.close();
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }


输出结果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<bookstore>

<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>

<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>

<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>

<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>333.9</price>
</book>

</bookstore>

猜你在找的XML相关文章