XML解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: XML解析

一、Java中配置文件的三种配置位置及读取方式

1.同包:类名.class.getResourceAsStream("文件名")

package com.ctb.parse;
import java.io.InputStream;
import java.util.Properties;
/**
 * java中配置文件的三种配置及读取文件
 * 1.同包下
 * 2.根目录下
 * 3.安全路劲--WEB-INF下
 * @author biao
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    //同包下获取方式
    InputStream is = Demo1.class.getResourceAsStream("config.properties");
    Properties pp=new Properties();
    pp.load(is);
    System.out.println(pp.getProperty("url"));
}
}

2.根路径:类名.class.getResourceAsStream("/文件名")

package com.ctb.parse;
import java.io.InputStream;
import java.util.Properties;
/**
 * java中配置文件的三种配置及读取文件
 * 1.同包下
 * 2.根目录下
 * 3.安全路劲--WEB-INF下
 * @author biao
 *
 */
public class Demo1 {
  public static void main(String[] args) throws Exception {
    //根目录下获取方式
    InputStream is1 = Demo1.class.getResourceAsStream("/config.properties");
    Properties pp1=new Properties();
    pp1.load(is1);
    System.out.println(pp1.getProperty("url"));
  }
}

3.WEB-INF安全路径:context.getResourceAsStream("/WEB-INF/文件名")

package com.ctb.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("webinf")
public class WebinfServlet extends HttpServlet{
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  doPost(req, resp);
  }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    InputStream is = req.getServletContext().getResourceAsStream("/WEB-INF/config.properties");
    Properties pp=new Properties();
    pp.load(is);
    System.out.println(pp);
  }
}

二、常见的xml解析工具

DOM4J

是所有xml解析中综合性能最优的产品。是一个简单、灵活的开放源代码的库,具有性能优异、功能强大和极易使用的特点。

JDOM和DOM

基于树模型,在运行的时候会将xml文件中的所有内容都加入到内存中,对内存的消耗大。适用于小文档。当文档超过15M左右的时候会出现内存溢出。

SAX解析

基于事件驱动,表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

1.简介:

   它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。

2、读取特定的xml中的内容

selectNodes():获取指定节点下的节点

selectSingleNode():获取指定节点和内容

getName():得到当前的元素名称

getText():得到元素中间的内容

attributeValue("sex"):得到元素对应的属性的值

package com.ctb.parse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * dom4J的使用
 * 
 * @author biao
 *
 */
public class Demo2 {
  public static void main(String[] args) throws Exception {
    InputStream is = Demo2.class.getResourceAsStream("students.xml");
    SAXReader sr = new SAXReader();
    //获取文件内容
    Document doc = sr.read(is);
    // 通过document对象获取根节点
    Element ele = doc.getRootElement();
    System.out.println(doc.asXML());
    System.out.println("-------------");
    List<Element> list = doc.selectNodes("/students/student");
    //遍历
    for (Element stuEle : list) {
      System.out.println(stuEle.asXML());
      Element nameEle = (Element) stuEle.selectSingleNode("name");
      System.out.println(nameEle.asXML());
      System.out.println(stuEle.attributeValue("sid"));
      System.out.println(nameEle.getText());
    }
  }
}

3.【优点】

①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。

②支持XPath。

③有很好的性能。

4.【缺点】

①大量使用了接口,API较为复杂。

四、SAX 解析

1.简介

SAX 的全称是 Simple APIs for XML,也即 XML 简单应用程序接口。与 DOM 不同,SAX 提供的访问模式是一种顺序模式,这是一种快速读写 XML 数据的方式。当使用 SAX 分析器对 XML 文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

package com.ctb.parse;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
/**
 * sax的使用
 * @author biao
 *
 */
public class Demo5 extends DefaultHandler {
  public static void main(String args[]) {
    long lasting = System.currentTimeMillis();
    try {
      SAXParserFactory sf = SAXParserFactory.newInstance();
      SAXParser sp = sf.newSAXParser();
      Demo5 reader = new Demo5();
      sp.parse(new InputSource("src/com/ctb/parse/students.xml"), reader);
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");//33毫秒
  }
}

【优点】

①不需要等待所有数据都被处理,分析就能立即开始。

②只在读取数据时检查数据,不需要保存在内存中。

③可以在某个条件得到满足时停止解析,不必解析整个文档。

④效率和性能较高,能解析大于系统内存的文档。

【缺点】

①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。

②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。

五、JDOM 解析

1.目的

是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。 JDOM文档声明其目的是“使用或更少的精力解决更多Java/XML问题”

2.【优点】

①使用具体类而不是接口,简化了DOM的API。

②大量使用了Java集合类,方便了Java开发人员。

3.【缺点】

①没有较好的灵活性。

②性能较差。

六、DOM 解析

1.简介

是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.

2.【优点】

①允许应用程序对数据和结构做出更改。

②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。

3.【缺点】

①通常需要加载整个XML文档来构造层次结构,消耗资源大。

②如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

七、DOM4J - XPath 解析XML

路径表达式

1. /  : 从根节点开始查找

2. // : 从发起查找的节点位置 查找后代节点 ***

3. .  : 查找当前节点

4. .. : 查找父节点

5. @  : 选择属性. *

       属性使用方式:

       [@属性名='值']

       [@属性名>'值']

       [@属性名<'值']

       [@属性名!='值']

package com.ctb.parse;
import java.io.InputStream;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * xpath定位路径
 * 
 * @author biao
 *
 */
public class Demo3 {
  public static void main(String[] args) throws Exception {
    // String str = System.getenv("students.xml");
    InputStream is = Demo3.class.getResourceAsStream("students.xml");
    SAXReader sr = new SAXReader();
    Document doc = sr.read(is);
    Element nameEle = (Element) doc.selectSingleNode("/students/student[@sid='s001']/name");
    System.out.println(nameEle.getText());
  }
}

八、DOM4J常用方法

1.获取根节点

Element root = document.getRootElement();

2.获取子节点

Element child = root.element("child");

3.获取属性

Attribute attr = root.attribute("id");
String attrValue = root.attributeValue("id");

4.遍历子节点

for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
    Element element = it.next();
    // 处理子节点
}

5.遍历属性

for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
    Attribute attribute = it.next();
    // 处理属性
}

6.获取属性值

String value = attribute.getValue();

7.获取元素文本内容

String text = element.getText();

8.添加子节点

Element child = root.addElement("child");

9.添加属性

root.addAttribute("id", "1");

10.修改元素文本内容

element.setText("new text");

11.修改属性值

attribute.setValue("new value");

12.删除节点

root.remove(child);

今天就分享到这啦,希望能帮助到您哦💕

相关文章
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
86 0
|
2月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
29天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
75 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0

推荐镜像

更多