小毛驴解析

XML解析

    

     解析XML的步骤:
    * 1、创建SAXReader
    * 2、创建File对象来描述文件
    * 3、使用SAXReader读取文件(解析的过程)
    *    并返回Document对象,其封装了整棵树
    * 4、通过Document获取根元素(根标签)
    * 5、根据XML的结构获取不同节点预计对应的信息

  

XML解析方式

1. SAX解析方式

SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。

而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。

其优缺点分别为:
优点: 解析可以立即开始,速度快,没有内存压力
缺点: 不能对节点做修改

2. DOM解析方式

DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中的所有元素,

按照其出现的层次关系,解析成一个个Node对象(节点)。

其优缺点分别为:
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点: 如果文件比较大,内存有压力,解析的时间会比较长

读取XML

1. SAXReader读取XML文档

使用SAXReader需要导入dom4j-full.jar包。其是DOM4J的一个核心API,用于读取XML文档。
DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。

我们使用了SAXReader读取了一个指定的文件,那么调用的方法是:

Document reader(File file)

该方法会读取给定的文件,并将其封装到一个名为Document的对象中。

2. Document的getRootElement方法

Document 对象是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。
当我们得到Document后就相当于我们得到了XML描述的整个树结构。那么我们就来开始解析的第一步工作,获取根元素。
获取根元素前,我们还需要提一下一个名为Element的类。

Element用于描述XML中的一个元素。元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。

Document的方法:
Element getRootElement()

用来获取当前XML文档中的根元素。

Element

1. element方法

当我们通过解析XML得到一个Element对象时,如何获取该对象所表示的元素的一些相关信息呢?
其中Element提供了一个方法:
Element element(String name)
该方法用于获取当前元素下指定名字的子元素。

若当前元素下包含若干个同名子元素,那么element方法会获取该元素中第一个子元素。
若我们希望获取当前元素下所有同名的子元素,我们可以使用elements方法。
2. elements方法

Element提供了另一个方法用于获取当前元素下所有子元素,其方法为:
List elements()

elements还有重载方法,比如我们希望获取当前元素下同名的所有子元素时,我们可以使用:
List elements(String name)
该方法会获取当前元素下所有给定名字的子元素。

3. getName方法

Element提供了一个方法,用于获取当前元素的名字:
String getName()

4. getText方法

Element还提供了一个方法,用于获取元素的文本节点(其实标记与结束标记之间的文本)
String getText()

5. attribute方法

Element的attribute方法用于获取当前元素的属性信息,其方法定义为:
Attribute attribute(int index)
获取当前元素的指定属性,index为索引,从0开始。
Attribute attribute(String name)
获取当前元素的指定名字的属性。

Attribute

1. getName方法和getValue方法

Attribute类的每一个实例用于描述一个元素中的某个属性信息。根据该对象我们通常会获取其对应的属性名与属性值的信息,这两个信息的获取依靠下列方法:
String getName() : 获取属性的名字
String getValue() : 获取属性的值

/**
 * 测试attribute方法
 */
public static void testAttribute(Element element){
    //获取当前元素的第一个属性
    Attribute attr = element.attribute(0);
    System.out.println(attr.getName());
    System.out.println(attr.getValue());
}

  

/**
 * 测试使用DOM解析xml
 */

public class TestReadXml {
    public static void main(String[] args) {
        try {
            //导入org.dom4j.*
            SAXReader reader =new SAXReader();
            //java.io.File
            File xmlFile =new File("emp.xml");
            /*
             * 解析xml 返回对应的Document对象
             * 该对象封装了xml文档中所有的内容
             */
            Document doc =reader.read(xmlFile);
            /*
             * 获取根标签(xml中的List标签)
             */
            Element root = doc.getRootElement();
            /*
             * 获取根标签(根元素)下的所有子标签(子元素)
             * 获取所有的
             */
            List<Element> elements =root.elements();
            /*
             * 获取当前标签下所有名字为emp的子标签
             */
            //List<Element> elements =root.elements(emp);

            //遍历所有子标签emp
            for(Element element:elements){
                System.out.println("标签:"+element.getName());
                //获取emp标签的ID属性值
                Attribute attribute =element.attribute("id");
                //获取该属性的值(id属性的值)
                int id =Integer.parseInt(attribute.getValue());
                System.out.println("员工ID:"+id);
                //获取emp标签中的name标签
            Element nameEle    =element.element("name");
            /*getText() 方法用于获取前标记和后标记之间的文本
             * <name>张三</name>
             * 若nameEle 描述的是name标签
             * 则nameEle.getText() 方法获取的事字符串 张三
             * 调用该方法应确保name标签中是文本信息
             */
            String name =nameEle.getText();
            System.out.println("员工名字:"+name);
            /*
             * 获取年龄
             * 我们希望获取emp标签中的子标签age中的文本
             * 两种方式:
             * 1.先获取age标签 在获取其中的文本 这个和上面获取name的方法一致
             * 2.字节调用elementText()方法
             * 例如:element.elementText("age")
             * 可以获取当前标签(emp)中名为age的标签中的文本
             * 这种写法更简洁
             */
            int age =Integer.parseInt(element.elementText("age"));
            System.out.println("员工年龄:"+age);
            //获取性别
            String gender =element.elementText("gender");
            System.out.println("员工性别:"+gender);
            //获取工资
            int salary =Integer.parseInt(element.elementText("salary"));
            System.out.println("员工工资"+salary);
            }
        } catch (Exception e) {

        }
    }
}

 1 /**
 2  * 该类用来描述XML文件中一个员工的信息
 3  * 这种设计方式要习惯
 4  * 对于一个表格保存的所有数据而言,有多少列(字段)
 5  * 我们这里就对应定义相应类型的属性
 6  * 这样我们可以用该类的每一个实例保存表格中每一行数据
 7  * @author Administrator
 8  *vo : value object
 9  */
10 class Emp{
11     private int id;
12     private String name;
13     private int age;
14     private String gender;
15     private int salary ;
16     public Emp(int id, String name, int age, String gender, int salary) {
17         super();
18         this.id = id;
19         this.name = name;
20         this.age = age;
21         this.gender = gender;
22         this.salary = salary;
23     }
24     public int getId() {
25         return id;
26     }
27     public void setId(int id) {
28         this.id = id;
29     }
30     public String getName() {
31         return name;
32     }
33     public void setName(String name) {
34         this.name = name;
35     }
36     public int getAge() {
37         return age;
38     }
39     public void setAge(int age) {
40         this.age = age;
41     }
42     public String getGender() {
43         return gender;
44     }
45     public void setGender(String gender) {
46         this.gender = gender;
47     }
48     public int getSalary() {
49         return salary;
50     }
51     public void setSalary(int salary) {
52         this.salary = salary;
53     }
54     @Override
55     public String toString() {
56         return "Emp [id=" + id + ", name=" + name + ", age=" + age
57                 + ", gender=" + gender + ", salary=" + salary + "]";
58     }
59
60 }

/**
 * 根据给定的xml文件名将该xml文件中的所有员工信息
 * 存入一个List集合中并返回
 * @author Administrator
 *
 */
class XmlUtil {
    private static String xmlFileName;

    public static List<Emp> main(String[] args) {
        List<Emp> list =new ArrayList<Emp>();
        try {
            /*
             * 解析XML的步骤:
             * 1、创建SAXReader
             * 2、创建File对象来描述文件
             * 3、使用SAXReader读取文件(解析的过程)
             *       并返回Document对象,其封装了整棵树
             * 4、通过Document获取根元素(根标签)
             * 5、根据XML的结构获取不同节点预计对应的信息
             */
            SAXReader reader =new SAXReader();
            File file =new File(xmlFileName);
            Document document =reader.read(file);
            Element root =document.getRootElement();
            //5
            List<Element> elements =root.elements();
            //遍历每一个emp标签
            for(Element empEle:elements){
                int id =Integer.parseInt(empEle.attribute("id").getValue());
                String name = empEle.elementText("name");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}

时间: 2024-08-03 01:07:21

小毛驴解析的相关文章

php小经验:解析preg_match与preg_match_all 函数

php小经验:解析preg_match与preg_match_all 函数 本篇文章是对php中的preg_match函数与preg_match_all函数进行了详细的分析介绍,需要的朋友参考下 正则表达式在 PHP 中的应用在 PHP 应用中,正则表达式主要用于:•正则匹配:根据正则表达式匹配相应的内容•正则替换:根据正则表达式匹配内容并替换•正则分割:根据正则表达式分割字符串在 PHP 中有两类正则表达式函数,一类是 Perl 兼容正则表达式函数,一类是 POSIX 扩展正则表达式函数.二者

微信小程序解析html

1.下载wxParse:https://github.com/icindy/wxParse并拷贝到项目目录下与pages同级即可2.在app.wxss全局样式头部引入wxParse.wxss2.在需要解析html的js头部引入wxParse.js并加载数据,如: var WxParse = require('../../../wxParse/wxParse.js'); Page({ onLoad: function (options) { that.setData({ content: WxPa

微信小程序 —— 微信小程序解析html富文本插件wxParse

下载并把wxParse放到小程序的目录中 github下载地址:https://github.com/icindy/wxParse 一.基本使用方法 1. Copy文件夹wxParse,把wxParse放在与page同一级目录 - wxParse/ -wxParse.js(必须存在) -html2json.js(必须存在) -htmlparser.js(必须存在) -showdown.js(必须存在) -wxDiscode.js(必须存在) -wxParse.wxml(必须存在) -wxPars

小程序解析html(使用wxParse)

正好遇到一个数据里面是html格式的数据,小程序不支持,网上找到这个做下记录,下面是我下好的wxParse文件目录 我的文件夹放的和pages同级 1.首先引入样式@import "/wxParse/wxParse.wxss"; 2.在需要加载html内容的页面对应的js文件里引入wxParse var WxParse=require('../../../wxParse/wxParse.js'); 3.使用 .js里面解析数据加这个就好了 //用wxParse解析html var ar

微信小程序解析富文本的几种方法

工作中有遇到过在小程序中需要解析后台管理系统设置的富文本内容, 一,可以使用wxParse插件解析html 使用方法 1.在github中下载 下载地址  https://github.com/icindy/wxParse/tree/master/wxParse 但是博住使用后 总是报 VM3004:1 thirdScriptErrorhtml.replace is not a function;at api request success callback function 遍在网上找资料 在

微信小程序解析HTML标签带有&lt;p&gt;

小程序中默认是不支持html格式没有<p>标签,但是有些接口需要返回带有标签的,例如 : 隐私协议: 解决方法: 小程序中有一个富文本标签组件,前端可以解析H5标签就是 rich-text.wxParse 一.<rich-text> : <rich-text nodes="{{content}}"></rich-text> 微信小程序文档:https://developers.weixin.qq.com/miniprogram/dev/c

四则运算小题目解析

小题目四则运算下面是源代码 #include <iostream> using namespace std; void main() {  int X0[1000],Y0[1000],Z0[1000],X1[1000],Y1[1000],Z1[1000],X2[1000],Y2[1000],Z2[1000],X3[1000],Y3[1000],Z3[1000],A[1000],a,b,c;  int i,j,A0,A1,A2,A3,B0,B1,B2,B3;  int number1,numbe

好久没发贴了,最近捣鼓了个基于node的图片压缩小网站解析。

看了下,距离上次发帖都是去年10月份的事,忙于工作的我很少跑博客园里面来玩了. 做这个小网站的初衷是 https://tinypng.com/ 这个网站有时候访问很慢,然后自己去研究了下图片压缩. 网上有看到 https://tinypng.com/ 中使用的 pngquant , 我去下载了pngquant的cli看了下,然后就开始了这个小网站的基础. 先看看前端页面: 这个功能还会扩建,所以现在界面只有简洁的一部分. 现在的功能基本上只有图片压缩和打包下载, 前端页面用到的: vue.web

小题解析

前两天一位朋友留言问了我关于js的小题,其实在这位朋友之前曾经也有人询问过此类题,思前想后觉得写出来给那些还正在解答此题中的朋友们.   原型 var add = function (m) { var temp = function (n) { return add(m + n); } temp.toString = function () { return m; } return temp; }; add(3)(4)(5); // 12 add(3)(6)(9)(25); // 43 这个ad