加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML基础--DOM4J解析

发布时间:2020-12-16 01:54:43 所属栏目:百科 来源:网络整理
导读:1.XML基础概念 XML:可扩展标记语言 概念: 可扩展: 标签名可以自己定义 hehe/hehe 呵呵/呵呵 命名规范:不能用数字开头 不能使用纯数字 区分大小写 功能:1.用作配置文件 2.用作网络数据传输的载体 xml 用于PC端数据传输的载体 JSON {"username":"张三","

1.XML基础概念

XML:可扩展标记语言
概念: 可扩展: 标签名可以自己定义 <hehe></hehe> <呵呵></呵呵>
命名规范:不能用数字开头 不能使用纯数字 区分大小写
功能:1.用作配置文件
2.用作网络数据传输的载体 xml 用于PC端数据传输的载体
JSON {"username":"张三","age":23,"sex":"1"} 一般用于移动端的数据传输载体 因为他体积小
语法:新建一个文本文件 后缀名必须为 .xml
组成部分:
文档声明:<?xml version="1.0" encoding="utf-8"?>
endoing 写的编码是规定哪里的编码? 告诉浏览用什么编码去解析
文档声明:必须顶行写,还有顶格写。
根标签:有且仅有一个根标签
其他标签 有开始标签 一定要有结束标签
文本:
CDATA区:该区域的文本,会按照纯文本解析
格式: <![CDATA[ 内容 ]]>

2.解析XML
解析思想:

1)DOM: Document Object Model 文档对象模型
DOM:将文档的各个组成部分 抽取一个对象
Element 标签对象
Attribute 属性对象
Text 文本对象
Comment 注释对象
Node 节点对象
Document? 文档对象
怎么解析:将文档一次性 加载进内存 然后将文档各个组成不封抽取为对象
优点: 能够对文档进行增删改查
缺点:耗内存 适用于PC 端

2)SAX :基于事件 逐行解析,一次读取一行,释放一行
优点 :不占内存 适用于移动端
缺点:只能查 不能增删改

3.解析器--DOM4J解析器

//创建解析器对象

SAXReader reader = new SAXReader();

//导入目标文件


1) 获取根标签对象
Element rootElement = doc.getRootElement();
// 获取根标签下的子标签 默认获取的是第一个子标签
Element stuElement = rootElement.element("student");
System.out.println(stuElement.getName());
// 获取所有的子标签
List<Element> eles = rootElement.elements();
for (Element ele : eles) {
System.out.println(ele.getName());
}
// 方式三 通过迭代器获取所有子标签
Iterator<Element> elementIterator = rootElement.elementIterator();
while (elementIterator.hasNext()) {
Element element = elementIterator.next();
System.out.println(element.getName());

}

2)获取属性对象

Element element = rootElement.element("student");
Attribute attribute = element.attribute("id");
String value = attribute.getValue();
String name = attribute.getName();
System.out.println(name);
System.out.println(value);
// 方式2:直接获取属性值
String value2 = rootElement.element("student").attributeValue("id");
System.out.println(value2);
// 方式三:获取所有的属性对象
List<Attribute> attributes = rootElement.element("student").attributes();
for (Attribute atr : attributes) {
String name2 = atr.getName();
String value3 = atr.getValue();
System.out.println(name2 + "======" + value3);

}

迭代器获取所有属性对象
Iterator<Attribute> attributeIterator = rootElement.element("student").attributeIterator();
while(attributeIterator.hasNext()){
Attribute attribute2 = attributeIterator.next();
System.out.println(attribute2.getName()+"=="+attribute2.getValue());

}

3)获取文本

//层层往下拿
String text = doc.getRootElement().element("student").element("name").getText();
System.out.println(text);
//方式2:
String text2 = doc.getRootElement().element("student").elementText("name");
System.out.println(text2);

4)获取节点

private static void getNodes(Element ele) {
System.out.println(ele.getName());
Iterator<Node> iterator = ele.nodeIterator();
while (iterator.hasNext()) {
Node nodes = iterator.next();
if (nodes instanceof Element) {//
Element ele2 = (Element) nodes;
getNodes(ele2);

// 递归调用 方法内部调用方法本身 注意递归比较耗费资源,因为他要不断的加载方法进栈内存 } } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读