JDK提供的XML解析方式分为两种:DOM方式和SAX方式
DOM:Document Object Model。需要读取整个XML文档,先需要在内存中构架代表整个DOM树的Document对象,可以进行随机访问. 需要考虑内存.适合增删改
SAX:Simple API for XML。采用事件驱动的方式解析XML文件,边读边对文档进行处理.适合读取

其他的xml解析包:Dom4J, PullParser(安卓)

Dom4J实现类似SAX方式, API类似DOM方式

DOM @JDK

  1. public class DomTest {
  2.  
  3. // 解析xml获取document对象
  4. private Document getDocument() throws ParserConfigurationException,
  5. SAXException, IOException {
  6. // 1. 获得工厂
  7. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  8. // 2. 获得 builder对象
  9. DocumentBuilder builder = factory.newDocumentBuilder();
  10. // 3. 解析xml得带document对象
  11. Document document = builder.parse("src/book.xml");
  12. return document;
  13. }
  14.  
  15. // 将内存中的document对象写回xml文件中
  16. private void writeBack2Xml(Document document)
  17. throws TransformerFactoryConfigurationError,
  18. TransformerConfigurationException, TransformerException {
  19.  
  20. TransformerFactory factory = TransformerFactory.newInstance();
  21. Transformer transformer = factory.newTransformer();
  22. transformer.transform(new DOMSource(document), new StreamResult("src/book.xml"));
  23. }
  24.  
  25. // 读取节点文本
  26. @Test
  27. public void testReadContent() throws Exception{
  28. Document document = getDocument();
  29. //根据标签名获得节点列表
  30. NodeList nodeList = document.getElementsByTagName("书");
  31. System.out.println("长度 : " + nodeList.getLength());
  32. // 返回第一个节点
  33. Node firstNode = nodeList.item(0);
  34. // 返回文本内容
  35. String result = firstNode.getTextContent();
  36. System.out.println(result);
  37. }
  38.  
  39. // 读取节点的属性值
  40. @Test
  41. public void testReadAttribute() throws Exception{
  42. Document document = getDocument();
  43. NodeList nodeList = document.getElementsByTagName("书");
  44. // 确认本Node为元素节点后加强转
  45. Node node = nodeList.item(0);
  46. if (node instanceof Element) {
  47. Element firstElement = (Element) node;
  48. String result = firstElement.getAttribute("出版社");
  49. System.out.println(result);
  50. }
  51. }
  52.  
  53. // 添加节点
  54. @Test
  55. public void testAddPrice() throws Exception, SAXException, IOException{
  56. Document document = getDocument();
  57. Node firstNode = document.getElementsByTagName("书").item(0);
  58. Element newElement = document.createElement("售价");
  59. newElement.setTextContent("79.00元");
  60. firstNode.appendChild(newElement);
  61. writeBack2Xml(document); //写回
  62. }
  63.  
  64. // 删除节点
  65. @Test
  66. public void testDelete() throws Exception, SAXException, IOException{
  67. Document document = getDocument();
  68. NodeList priceNodeList = document.getElementsByTagName("售价");
  69. for (int i = 0; i < priceNodeList.getLength(); i++) {
  70. Node node = priceNodeList.item(i);
  71. if("39.00元".equals(node.getTextContent())){
  72. // 从父节点删除子节点, 类似dom的api
  73. node.getParentNode().removeChild(node);
  74. }
  75. }
  76. writeBack2Xml(document);
  77. }
  78.  
  79. // 打印所有元素节点的名称
  80. @Test
  81. public void testPrintAllElementsName() throws Exception, SAXException, IOException{
  82. Document document = getDocument();
  83. // 递归打印
  84. printAllElementsName(document);
  85. }
  86.  
  87. public void printAllElementsName(Node node){
  88. // 打印本节点
  89. if(Node.ELEMENT_NODE==node.getNodeType()){
  90. System.out.println(node.getNodeName());
  91. }
  92. // 处理子节点
  93. NodeList childNodes = node.getChildNodes();
  94. for (int i = 0; i < childNodes.getLength(); i++) { //递归出口: 循环完成
  95. Node item = childNodes.item(i);
  96. printAllElementsName(item);
  97. }
  98. }
  99. }

SAX @JDK

  1. public class SaxTest {
  2.  
  3. public static void main(String[] args) throws Exception, SAXException {
  4.  
  5. SAXParserFactory factory = SAXParserFactory.newInstance();
  6. SAXParser parser = factory.newSAXParser();
  7. XMLReader reader = parser.getXMLReader();
  8. reader.setContentHandler(new MyDefaultHandler());
  9. reader.parse("src/book.xml");
  10. }
  11. }
  12.  
  13. class MyDefaultHandler extends DefaultHandler {
  14.  
  15. // 作为被调用方, 流程不是这边控制, 所以定义状态位或计数器来标记流程进行的位置
  16. private boolean isPrice = false;
  17. private int count =1;
  18.  
  19. @Override
  20. public void startElement(String uri, String localName, String qName, // qName标签名
  21. Attributes attributes) throws SAXException {
  22. if ("售价".equals(qName)) {
  23. isPrice = true;
  24. count++;
  25. }
  26. }
  27.  
  28. @Override
  29. public void endElement(String uri, String localName, String qName)
  30. throws SAXException {
  31. if ("售价".equals(qName)) {
  32. isPrice = false;
  33. }
  34. }
  35.  
  36. // 读到文本了
  37. @Override
  38. public void characters(char[] ch, int start, int length)
  39. throws SAXException {
  40. if (isPrice&&count==3) {
  41. System.out.println("文本: " + new String(ch, start, length));
  42. }
  43. }
  44. }

Dom4J

  1. public class Dom4JTest {
  2.  
  3. private Document getDocument() throws DocumentException {
  4. // 获得 代表 xml 文件的 document 对象
  5. SAXReader reader = new SAXReader();
  6. Document document = reader.read("src/book.xml");
  7. return document;
  8. }
  9.  
  10. private void wirteBack2Xml(Document document) throws UnsupportedEncodingException, FileNotFoundException, IOException {
  11. OutputFormat format = OutputFormat.createPrettyPrint();
  12. format.setEncoding("UTF-8");
  13. XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
  14. writer.write(document);
  15. writer.close();
  16. }
  17.  
  18. // 读取节点的文本内容
  19. // 由于 dom4j采用sax方式去解析的xml文档, 所以dom4j不能直接获得深层次的某个节点, 需要一级级获得
  20. @Test
  21. public void testReadContent() throws Exception{
  22.  
  23. Document document = getDocument();
  24.  
  25. Element rootElement = document.getRootElement();
  26. Element firstLevelElement = rootElement.element("ele1");
  27. Element secondLevelElement = firstLevelElement.element("ele2");
  28.  
  29. String value = secondLevelElement.getText();
  30. System.out.println(value);
  31. }
  32.  
  33. // 读取属性值
  34. @Test
  35. public void testReadAttribute() throws Exception{
  36.  
  37. Document document = getDocument();
  38.  
  39. Element rootElement = document.getRootElement();
  40.  
  41. List<Element> list = rootElement.elements("书");
  42. Element secondElement = list.get(1);
  43. Attribute attribute = secondElement.attribute("出版社");
  44.  
  45. String value = attribute.getValue();
  46. System.out.println(value);
  47. }
  48.  
  49. // 添加节点
  50. @Test
  51. public void testAddPrice() throws Exception{
  52.  
  53. Document document = getDocument();
  54.  
  55. Element rootElement = document.getRootElement();
  56. Element secondBookElement = (Element) rootElement.elements("书").get(1);
  57. // 创建新节点
  58. secondBookElement.addElement("newEle").setText("this is new Element");
  59.  
  60. wirteBack2Xml(document);
  61. }
  62.  
  63. // 删除节点
  64. @Test
  65. public void testDeletePrice() throws Exception{
  66.  
  67. Document document = getDocument();
  68. Element rootElement = document.getRootElement();
  69. Element secondBookElement = (Element) rootElement.elements("书").get(1);
  70. Element targetBookPrice = (Element) secondBookElement.elements("售价").get(0);
  71.  
  72. // 拿到父节点, 然后删除这个子节点
  73. targetBookPrice.getParent().remove(targetBookPrice);
  74. wirteBack2Xml(document);
  75. }
  76. }

XML的两种解析方式的更多相关文章

  1. xml中俩种解析方式

    两种解析方式 1.from xml.etree import ElementTree as ET 利用ElementTree模块下的xml方法可以把一个字符串类型的东西转换成Element类,从而利用 ...

  2. xml常用四种解析方式优缺点的分析×××××

    xml常用四种解析方式优缺点的分析 博客分类: xml   最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...

  3. XML 的4种解析方式

    在上一篇博客中,我们介绍了什么是 XML ,http://www.cnblogs.com/ysocean/p/6901008.html,那么这一篇博客我们介绍如何来解析 XML . 部分文档引用:ht ...

  4. Android平台中实现对XML的三种解析方式

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  5. Javaweb学习笔记——(六)——————xml中jaxp两种解析方式和dom4j运用

    1.xml的scheam约束 dtd的语法:<!ElEMENT 元素名称 约束> **schema符合xml的语法,xml语句 **一个xml中可以有多个schema,多个schema使用 ...

  6. XML解析——Java中XML的四种解析方式

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

  7. XML解析——Java中XML的四种解析方式(转载 by 龍清扬)

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

  8. xml的四种解析方式(转载)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  9. C#读写XML的两种一般方式

    针对XML文档的应用编程接口中,一般有两种模型:W3C制定的DOM(Document Object Method,文档对象模型)和流模型. 流模型的两种变体:"推"模型(XML的简 ...

随机推荐

  1. Codeforce 475 C. Kamal-ol-molk&#39;s Painting

    从最左上的点開始枚举长宽.... C. Kamal-ol-molk's Painting time limit per test 2 seconds memory limit per test 256 ...

  2. (4.17)sql server中的uuid获取与使用

    sql server中的uuid  建表: 1.自增长 studentno int primary key identity(1,1)——bigint也是可以的 2.创建uuidcustomerid  ...

  3. 002-es6字符串扩展

    1.字符串扩展 参考地址:http://es6.ruanyifeng.com/#docs/string 1.1.codePointAt() JavaScript 内部,字符以 UTF-16 的格式储存 ...

  4. path的join和resolve的使用区别

    文章目录   1.连接路径:path.join([path1][, path2][, ...]) 2.路径解析:path.resolve([from ...], to) 3.对比 1.连接路径:pat ...

  5. Cannot format given Object as a Date

    这个小错挺有意思的,记录一下 导出Excel的时候,同事直接用 format …… 前提:数据库中该字段是 Timestamp ---- 2016-06-20 22:49:02.967 写个测试说明一 ...

  6. Java集合(1):ArrayList

    Java容器类的用途是“保存对象”,分为两类:Map——存储“键值对”组成的对象:Collection——存储独立元素.Collection又可以分为List和Set两大块.List保持元素的顺序(有 ...

  7. LeetCode:组合总数II【40】

    LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...

  8. 微信小程序 canvas 生成随机验证码

    转载:https://blog.csdn.net/qq_16646819/article/details/81020245?utm_source=blogxgwz0 js // pages/bind/ ...

  9. 113. Path Sum II(求等于某个数的所有路径)

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  10. Bootstrap总结二

    参考我的博客:http://www.isedwardtang.com/2017/09/01/bootstrap-primer-2/