JavaWeb-XML解析

  1. XML解析方式
    • XML有三种解析方式:dom、sax、pull
      • dom:(Doucument Object Model,文档对象模型)是W3C组织推荐的
      • sax:(Simple API for XML)是XML社区推出的,几乎所有XML解析器都支持它。
      • pull:Pull解析和Sax解析很相似,都是轻量级的解析,它是一个第三方开源的Java项目,Android的内核中已经嵌入了Pull。
  2. XML解析开发包
    • 常用开发包:Jaxp、Jdom、dom4j
  3. JAXP :JAXP 开发包是J2SE的一部分,它由 javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
    • JAXP的解析过程
      • 在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
    • dom解析
      • 读取
        • 得到DocumentBuilderFactory的实例,再得到 DocumentBuilder实例
        • 使用DocumentBuilder解析出一个Document
      • 写入
        • 得到TransformerFactory的实例,再得到 Transformer的实例
        • 使用 Transformer把内存中的Document保存
      • 注意:
        • 不足之处,DOM 解析 XML 文档时,需要读取整个 XML 文档,内存中需要构建代表DOM树的整个Document对象,这样消耗内存太大,容易溢出。
    • sax解析
      • 读取
        • 得到SAXParserFactory的实例,得到SAX解析器SAXParser
        • 通过 SAXParser 得到读取器XMLReader
        • 通过XMLReader注册事件处理器reader.setContentHandler,
          • 事件处理器由程序员编写,程序员通过事件处理器中方法(如 startDocument、startElement、characters )的参数,  就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
        • 通过XMLReader读取XML文档 reader.parse("src/books.xml");
      • 写入
        • 只能读,不能写
      • 注意:
        • SAX解决了DOM解析中读取整个DOM树耗内存的缺点,它允许在读取文档时就处理,不必等读取结束。
        • SAX需要实现ContentHandler接口,可以使用默认适配器模式,只实现需要的一部分方法。
    • pull解析

      • 读取
        • 通过XmlPullParserFactory得到pull解析器:XMLPullParser
        • 通过XmlPullParser的setInput方法传入要读取的XML文件
        • 读第一部分:得到读到的当前部分的类型 
          • 使用parser.getEventType()得到 5个int型常量,这5个常量代表
          • START_DOCUMENT:文档开始
          • END_DOCUMENT:文档结束
          • START_TAG:元素开始
          • END_TAG:元素结束
          • TEXT:主体内容开始
        • 判断是不是你想要的类型:
        • 游标下移next(),需要主动下移。
      • 写入
        • 只能读,不能写
      • 注意:
        • 在SAX中,即使已经找到需要的数据,XML数据还是继续加载进内存并执行方法,程序员没法停止这些无用操作。
        • pull解决了SAX中的不足,pull加载每一部分产生方法调用,都必须需要调用一个固定的方法nexteevntType = parser.next();才能继续下去,否则解析工作结束。
      • 疑问:pull怎么读取属性,在XmlPullParser中没找到属性开始和结束两个 静态常量 。
  4. DOM4j : DOM4j 开发包使用接口和抽象基类,
    • DOM4j 的解析过程
      • 使用 DOM4j,首先需要创建Document对象,然后再操作。

      • 得到Document对象
        • DOM4j中,获得Document对象的方式有三种:
        • 读取XML文件,获得document对象 
          1. SAXReader reader = new SAXReader();
          2. Document document = reader.read(new File("input.xml"));
        • 解析XML形式的文本,获得Document对象
          1. String text = "<student></student>";
          2. Document document = DocumentHelper.parseText(text);
        • 主动创建空Document对象
          1. Document document = DocumentHelper.createDocument();
          2. //创建根节点
          3. Element root = document.addElement("student");
      • 元素Element操作

        • //获取文档的元素.
        •       Element root = document.getRootElement();
        • //获取某个元素的指定名称的第一个子节点.
        • Element element = element.element(“书名");
        • //获取某个元素的指定名称的所有子元素的集合
        •       List list = element.elements(“书名”);
        • //添加一个指定名称的子元素
        •       Element childEle = parentEle.addElement(“书名”);
        • //删除某个元素指定的子元素
        • parentEle.remove(childEle);
      • 属性Attribute操作

        • //获取某个元素的指定名称的属性对象
        •       Attribute attr = element.attribute(“id”);
        • //获取某个元素的指定名称的属性值
        • String id = element.attributeValue(“id”);
        • //给元素添加属性或更新其值
        •       Attribute attr = element.addAttribute(“id”,”123”);
        • //删除某个元素的指定属性
        •       element.remove(attribute);
      • 文本Text的操作

        • //获取某个元素的文本内容
        •       String text = element.getText();
        • //给某个元素添加或更新文本内容
        • element.setText(“Tom”);
      • 将文档写入XML文件. 

        • 1.文档中全为英文,不设置编码,直接写入的形式.  XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));  writer.write(document);  writer.close();

        • 2.文档中含有中文,设置编码格式写入的形式.OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML编码                   
        •      format.setEncoding( “utf-8");       XMLWriter writer = new XMLWriter( newFileWriter( "output.xml“ ),format);writer.write(document);writer.close();
      • 字符串与XML对象的转换 

        • 1.将字符串转化为XML
        •      String text = "<members> <member>sitinspring</member></members>";Document document = DocumentHelper.parseText(text);

        • 2.将文档或节点的XML转化为字符串.
        •      SAXReader reader = new SAXReader();Document   document = reader.read(new File("input.xml"));            Element root= document.getRootElement();    
        •             String docXmlText = document.asXML();String rootXmlText = root.asXML();Element memberElm = root.element( "member");String memberXmlText = memberElm.asXML();
  5. XPath介绍

    • XPath 是在 XML 文档中查找信息的语言 
    • XPath 是通过元素和属性进行查找
    • XPath简化了Dom4j查找节点的过程
    • 使用XPath必须导入jaxen-1.1-beta-6.jar
    • 否则出现
    • NoClassDefFoundError: org/jaxen/JaxenException

    • XPath语法
    • /students/student
      从根元素开始逐层找,以”/”开头

      //name 直接获取所有name元素对象,以“//”开头
      //student/* 获取所有student元素的所有子元素对象
      //student[1]或//student[last()] 获取所有student元素的第一个或最后一个
      //student[@id] 获取所有带id属性的student元素对象
      //student[@id=‘002'] 获取id等于002的student元素对象
  6. 查询节点
    • 获取所有符合条件的节点
    • document.selectNodes(String xpathExpression) 
    • 返回List集合
    • 获取符合条件的单个节点
    • document.selectSingleNode(String xpathExpression) 
    • 返回一个Node对象。
    • 如果符合条件的节点有多个,那么返回第一个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值