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);// 递归调用 方法内部调用方法本身 注意递归比较耗费资源,因为他要不断的加载方法进栈内存
} } }