获得TransformerFactory对象
创建Transformer对象
创建DOMSource对象---包含XML信息
设置输出属性---编码格式
创建StreamResult对象---包含保存文件的信息
将XML保存到指定文件中
- //保存XML文件:将java内存中的document对象存储到外部xml文件中,需要借助转换器对象实现此功能
- public void savaXML(String path){
- //创建转换器工厂对象
- TransformerFactory factory=TransformerFactory.newInstance();
- //设置首行缩进,4个字符
- factory.setAttribute("indent-number", "4");
- try {
- //通过转换器工厂对象创建转换器对象
- Transformer transformer=factory.newTransformer();
- //设置存储的格式
- transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
-
- // StreamResult result=new StreamResult(new FileOutputStream(path));
- StreamResult result=new StreamResult(new OutputStreamWriter(new FileOutputStream(path), "gb2312"));
- // StreamResult result=new StreamResult(path);
- DOMSource source=new DOMSource(document);
- /*
- * 通过转换器对象调用方法将java内存中的document对象存储到外部xml文件中,transform(Source source,Result result)
- * 需要两个参数,Source标识源头,也就是java内存中的document对象,而Source是一个接口,不能直接创建对象,可以使用其实现类DomSource
- * Result表示结果,也就是java内存中的document对象要存储的位置,而Result是一个接口,不能直接创建对象,可以使用其实现类StreamResult
- */
-
- transformer.transform(source, result);
- } catch (TransformerConfigurationException e) {
- e.printStackTrace();
- } catch (TransformerException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
通过Document调用方法创建一个元素节点
通过创建的元素节点调用方法给元素节点设置属性及属性值
将创建好的两个节点建立关系
获取xml文件中创建好的标签的上一个元素节点,然后将创建好的标签作为子节点追加到获取元素节点中,一直追加到无法追加为止
元素添加完毕之后需要将java内存中的document对象存储到xml文件中
- //添加元素到XML文件中
- public void add(){
- //通过Document调用方法创建一个元素节点
- Element element=document.createElement("Brand");
- //通过创建的元素节点调用方法给元素节点设置属性及属性值
- element.setAttribute("name", "三星");
- //通过Document调用方法创建一个元素节点
- Element ele1=document.createElement("Type");
- //通过创建的元素节点调用方法给元素节点设置属性及属性值
- ele1.setAttribute("name", "Note3");
- //将创建好的两个节点建立关系
- element.appendChild(ele1);
- //获取xml文件中的第一个PhoneInfo元素节点,然后将创建好的brand标签作为子节点追加到获取的第一个PhoneInfo元素节点中
- document.getElementsByTagName("PhoneInfo").item(0).appendChild(element);
- //元素添加完毕之后需要将java内存中的document对象存储到xml文件中
- this.savaXML("收藏信息.xml");
- }
通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
遍历节点集合:修改节点(给节点添加了一个id属性)
取出节点集合中的元素
将节点元素转换成其真正的类型
给元素节点添加了一个新的属性id
- //修改:修改xml文件中的内容
- public void update(){
- //通过document对象获取你要修改的元素,将获取的元素存储在节点集合中
- NodeList brands=document.getElementsByTagName("Brand");
- //遍历节点集合:修改节点(给节点添加了一个id属性)
- for(int i=0;i
- //取出节点集合中的元素
- Node brand=brands.item(i);
- //将节点元素转换成其真正的类型
- Element eleBrand=(Element)brand;
- //给元素节点添加了一个新的属性id
- eleBrand.setAttribute("id", i+"");
- }
- this.savaXML("收藏信息.xml");
- }
删除DOM节点
通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
遍历集合 取出节点集合中的元素
将节点转换成真正的类型
从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点
- public void delete(){
- //通过document对象获取你想要删除的元素节点,将元素节点存储在节点集合中
- NodeList brands=document.getElementsByTagName("Brand");
- //遍历集合
- for(int i=0;i
- //取出节点集合中的元素
- Node brand=brands.item(i);
- //将节点转换成真正的类型
- Element eleBrand=(Element)brand;
- //从遍历出的元素节点找出你要删除的元素节点,通过元素节点的属性值来找
- if(eleBrand.getAttribute("name").equals("华为")){
- //删除元素不能自己删除自己,需要通过其父元素来删除,getParentNode(),获取父节点 removeChild()删除子节点
- eleBrand.getParentNode().removeChild(eleBrand);
- }
- }
- this.savaXML("收藏信息.xml");
- }
DOM4J解析XML
DOM4J
Document:定义XML文档
Element:定义XML元素
Text:定义XML文本节点
Attribute:定义了XML 的属性
使用DOM4J需要导入文件,https://dom4j.github.io/#parsing 在这里面可以找到
随便找一个,下载.jar文件。下载好之后接下来就是导入包了
将刚才下载下来的文件复制到刚刚创建的文件夹中
这样就好了。
- public class Dom4j {
-
- public static Document doc;
-
- public static void main(String[] args) {
- loadDocument();
- // showPhoneInfo();
- // saveXML("收藏信息.xml");
- // addNewPhoneInfo();
- // updatePhoneInfo();
- deleteItem();
- showPhoneInfo();
- }
-
- //定义方法,将xml文件转换为document对象
- public static void loadDocument(){
- try{
- //创建SAXReader类对象,调用reader()方法将XMl文件转换为document类对象
- SAXReader saxReader = new SAXReader();
- doc = saxReader.read(new File("收藏信息.xml"));
- }catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- }
-
- public static void updatePhoneInfo(){
- // 获取XML的根节点
- Element root = doc.getRootElement();
- int id = 0;
- for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
- Element brand = (Element) itBrand.next();
- id++;
- brand.addAttribute("id", id + "");
- }
- saveXML("收藏信息.xml");
- }
-
- public static void deleteItem(){
- // 获取XML的根节点
- Element root = doc.getRootElement();
- for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
- Element brand = (Element) itBrand.next();
- if (brand.attributeValue("name").equals("华为")) {
- //删除元素需要通过其父元素来进行删除
- brand.getParent().remove(brand);
- }
- }
- saveXML("收藏信息.xml");
- }
-
- //定义方法显示XML文件中的手机品牌和类型
- public static void showPhoneInfo() {
- // 获取XML的根节点
- Element root = doc.getRootElement();
- // 通过根节点调用elementIterator()方法获取根节点的所有子元素Brand,将获取的brand标签存储在迭代器中,然后遍历所有的Brand标签
- for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
- Element brand = (Element) itBrand.next();
- // attributeValue(属性名: )根据属性名输出标签的name属性
- System.out.println("品牌:" + brand.attributeValue("name"));
- // 使用brand节点调用elementIterator()方法获取brand标签的子标签type,然后遍历Type标签
- for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
- Element type = (Element) itType.next();
- // attributeValue(属性名: )根据属性名输出标签的name属性
- System.out.println("\t型号:" + type.attributeValue("name"));
- }
- }
-
- }
-
- public static void saveXML(String path){
- try {
- OutputFormat format = OutputFormat.createPrettyPrint();
- format.setEncoding("GBK"); // 指定XML编码
- XMLWriter writer;
- writer = new XMLWriter(new FileWriter(path), format);
- writer.write(doc);
- writer.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- public static void addNewPhoneInfo(){
- // 获取XML的根节点
- Element root = doc.getRootElement();
- // 创建Brand标签
- Element el = root.addElement("Brand");
- // 给Brand标签设置属性
- el.addAttribute("name", "三星");
- // 创建Type标签
- Element typeEl = el.addElement("Type");
- // 给Type标签设置属性
- typeEl.addAttribute("name", "Note4");
- saveXML("src/收藏信息.xml");
- }
-
- }
-
相关阅读:
【C++初阶7-string】真方便,真舒服
std::function
基于文化算法优化的神经网络预测研究(Matlab代码实现)
无代码开发平台子管理员入门教程
微信公众号window.open(url, '_blank');打不开网页
灵性图书馆:好书推荐-《奥修传》
Git系列讲解 —— 提交日志(git log)的使用
Anniversary party(树形dp 基础题)
备忘录模式-撤销功能的实现
Ajax学习56~68(跨域与JSONP)
-
原文地址:https://blog.csdn.net/qihaojinqiuma/article/details/126530423