/*
* 使用jaxp的sax方式解析xml
* sax方式不能实现增删改操作 只能做查询操作
* 打印整个文档
* 执行parse方法 第一个参数xml路径 第二个参数 是事件处理器
* 创建一个类 继承事件处理器的类
* 重写里面的三个方法
* 获取到所有的name元素的值
* 定义一个成员变量 flag=false
* 判断开始方法是否是name元素 如果是name元素 把flag值设置成 true
* 如果flag值是true 在characters方法里面打印内容
* 当执行到结束方法时候把 flag值设置成false
* 获取第一个name元素的值
* 定义一个成员变量 index=0
* 在结束方法时候 index+1 index++
* 想要打印出第一个name元素的值
* 在characters方法里面判断
* 判断flag=true 并且 index==0 再打印内容
* 使用dom4j解析xml
* dom4j 是一个组织 针对xml解析 提供解析器 dom4j
* dom4j不是javase的一部分 想要使用第一步需要
* 导入dom4j提供的jar包
* 创建一个文件夹lib
* 复制jar包到lib下面
* 右键jar包 build path
* 看到jar包 变成奶瓶样子 表示导入成功
* 得到document
* SAXReader reader = new SAXReader();
* Document document = reader.read();
* document的父接口是Node
* 如果在document里面找不到方法 在Node里面找
* document里面的方法 getRootElement() 获取根节点 返回的是Element
* Element也是一个接口 父接口是Node
* Element和Node里面方法
* getParent() 获取父节点
* addElement() 添加标签
* element(qName)
* 表示获取标签下面的第一个子标签
* qname标签的名称
* elements(qName)
* 获取标签下面的是这个名称的所有子标签(一层)
* qname 标签名称
* elements()
* 获取标签下面的所有一层子标签
* 使用dom4j查询xml
* 解析是从上到下的解析
* 查询所有name元素里面的值
* 1、创建解析器
* 2、得到一个document
* 3、得到根节点 getRootElement() 返回Element
*
* 4、得到所有的p1标签
* elements("head") 返回list集合
* 遍历list得到每一个head
* 5、得到name
* 在head 下面执行element("name")方法 返回Element
* 6、得到name里面的值
* getText()方法得到值
* 查询第一个name元素的值
* 1、创建解析器
* 2、得到一个document
* 3、得到根节点 getRootElement() 返回Element
*
* 4、得到所有的p1标签
* element("head") 返回Element
* 5、得到name
* 在head 下面执行element("name")方法 返回Element
* 6、得到name里面的值
* getText()方法得到值
* 获取第二个title元素的值
* 1、创建解析器
* 2、得到一个document
* 3、得到根节点 getRootElement() 返回Element
*
* 4、得到所有的head标签
* elements("head") 返回list集合
* 5、遍历得到第二个head
* 使用list下标得到 get方法 集合的下标从0开始 想要得到第二个 下标写1
*
* 6、得到第二个head里面的title
* element("title") 方法 返回Element
* 7、得到title的值
* getText()方法
* 使用dom4j实现添加操作
* 在第一个head标签末尾添加一个元素<age>11</age>
* 步骤
* 1、创建解析器
* 2、得到document
* 3、得到根节点
* 4、获取到第一个head
* 使用element方法
* 5、在head下面添加元素
* 在head上面直接使用addElement("标签名称") 方法 返回一个Element
* 6、在添加完成滞后的元素下面添加文本
* 在age上面直接使用 setText("文本内容")方法
* 7、回写xml
* 格式化 OutputFormat 使用 createPrettyPrint 方法 表示一个漂亮的格式
* 使用类XMLWriter 直接new 这个类 传递两个参数
* 第一个参数是xml文件路径 new FileOutputStream("路径")
* 第二个参数是格式化类的名称
* 在特定的位置添加元素
* 在第一个head下面的age标签添加<school>abc</school>
* 步骤
* 1、创建解析器
* 2、得到document
* 3、得到根节点
* 4、获取到第一个head
* 5、获取head下面年的所有的元素
* elements()方法 返回list集合
* 使用list里面的方法 在特定位置添加元素
* 首先创建 元素 在元素下面创建文本
* 使用DocumentHelper类方法 createElement创建标签
* 把文本添加到标签下面 使用setText("文本内容")方法
* list集合里面的add(int index,E element)
* 第一个参数是 位置下标 从0开始
* 第二个参数是 要添加的元素
* 6、回写xml
*
* 可以对得到document的操作和回写xml的操作 封装成方法
* 也可以把传递的文件连接 封装成一个常量
* 好处 可以提高开发速度 可以提高代码可维护性
* 比如想要修改文件路径(名称) 这个时候只需要修改常量的值就行了
*/
public static void addSchool() throws Exception{
SAXReader saxr = new SAXReader();
Document document = saxr.read("src\\ee\\11.out.xml");
Element root = document.getRootElement();
Element head = root.element("head");
List<Element> list = head.elements();
Element school = DocumentHelper.createElement("school");
school.setText("abc");
list.add(0, school);
OutputFormat of = OutputFormat.createPrettyPrint();
XMLWriter xmlw = new XMLWriter(new FileOutputStream("src\\ee\\12.out.xml"),of);
xmlw.write(document);
xmlw.close();
}
public static void addAge() throws Exception{
SAXReader saxr = new SAXReader();
Document document = saxr.read("src\\ee\\11.out.xml");
Element root = document.getRootElement();
Element head = root.element("head");
Element age = head.addElement("age");
age.setText("11");
OutputFormat of = OutputFormat.createPrettyPrint();
XMLWriter xmlw = new XMLWriter(new FileOutputStream("src/ee/11.out.xml"),of);
xmlw.write(document);
xmlw.close();
}
public static void selectSecond() throws Exception {
Element root = getRoot();
List<Element> list = root.elements("head");
Element h2 = list.get(1);
Element title = h2.element("title");
String s = title.getText();
System.out.println(s);
}
public static void selectFirst() throws Exception {
Element root = getRoot();
Element head = root.element("head");
Element title = head.element("title");
String s = title.getText();
System.out.println(s);
}
private static Element getRoot() throws DocumentException {
SAXReader saxr = new SAXReader();
Document document = saxr.read("src\\ee\\11.out.xml");
Element root = document.getRootElement();
return root;
}
public static void selecttitle() throws Exception {
Element root = getRoot();
List<Element> list = root.elements("head");
for (Element element : list) {
Element title = element.element("title");
String s = title.getText();
System.out.println(s);
}