DOM4J操作XML

来源:互联网 发布:淘宝网店如何起步 编辑:程序博客网 时间:2024/06/05 17:27
<?xml version="1.0" encoding="GBK"?><Phone>   <Brand name="Apple">     <Type name="iphone 8s"/>   </Brand>    <Brand name="HuaWei">     <Type name="荣耀"/>   </Brand>    <Brand name="小米">     <Type name="小米5s"/>   </Brand>    <Brand name="小米">     <Type name="小米5s"/>   </Brand> </Phone>
package com.cn;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.io.Writer;import java.util.Iterator;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.QName;import org.dom4j.dom.DOMAttribute;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class TestDoc4j {Document doc = null;public static void main(String[] args) {TestDoc4j td = new TestDoc4j();// 1. 加载DOM树(读取XML文档)td.loadDocument();// 2. 读取DOM树文档内容// td.showInfo();// 3. 保存xml文件// String path = "src/com/cn/xml/new.xml";// td.saveXML(path);// 4.添加节点信息到xml文件// td.addElementInfo();// 展示一下// td.showInfo();// 5.修改节点信息到xml文件td.changeElementInfo();// 6.删除节点信息td.deleteElementInfo();td.showInfo();}private void deleteElementInfo() {// 获取根节点Element root = doc.getRootElement();// 把根节点中所有的子节点全部放入迭代器@SuppressWarnings("unchecked")Iterator<Element> iterator = root.elementIterator();// 循环遍历根节点while (iterator.hasNext()) {Element brandEle = iterator.next();// 把当前节点的name属性值与OPPO匹配,如果匹配,则移除该点if (brandEle.attributeValue("name").equals("OPPO")) {// 找到brand品牌节点的父节点,然后移除name值为OPPO的brand节点brandEle.getParent().remove(brandEle);// 通过创建DOMAttribute对象,用QName.get获取指定属性清除指定节点指定属性brandEle.remove(new DOMAttribute(QName.get("id")));break;// 只要删除找到匹配的第一个就跳出循环}}this.saveXML("src/com/cn/xml/new.xml");}private void changeElementInfo() {// 1.1 得到标签对象Element elem = doc.getRootElement().element("Brand");// 1.2 得到id属性对象 修改属性值elem.attribute("name").setValue("xixi");/** * 修改属性值(方案二) 方法:Element标签类的addAttribute("attr","value")方法 *//* * //1.得到属性值标签 Element stuElem=doc.getRootElement().element("student"); * //2.通过增加同名属性的方法,修改属性值 stuElem.addAttribute("id", "000009"); * //key相同,覆盖;不存在key,则添加 *//** * 修改文本 方法:Element标签类的setTest("新文本值")方法 1.得到标签对象 2.修改文本 */Element nameElem = doc.getRootElement().element("Brand").element("Type1");nameElem.setText("王二麻子");this.saveXML("src/com/cn/xml/new.xml");}private void addElementInfo() {// 获取根节点Element rootele = doc.getRootElement();// 添加Brand子节点给根节点Element brandele = rootele.addElement("Brand");// 给Brand节点增加属性及属性值brandele.addAttribute("name", "小米");// 给Brand节点增加子节点TypeElement type = brandele.addElement("Type");// 给Type增加属性及属性值type.addAttribute("name", "小米5s");// 保存新增信息this.saveXML("src/com/cn/xml/new.xml");}private void saveXML(String path) {// 1.创建XMLWriter字符输出流对象XMLWriter xmlwriter = null;try {// 2. 创建writer对象指向FileWriter,并把地址给出Writer writer = new FileWriter(path);// 3. 指定xml生成时,声明中的Ecoding字符集编码格式// OutputFormat of = new OutputFormat();// 自动换行缩进OutputFormat of = OutputFormat.createPrettyPrint();of.setEncoding("GBK");// 4. 把指定的xml格式及文件输出流对象,利用xmlWriter输出到指定目的地输出文件xmlwriter = new XMLWriter(writer, of);// 5. 调用writer方法,以DOM树为入参,生成xml文件xmlwriter.write(doc);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {xmlwriter.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private void showInfo() {Element ele = doc.getRootElement();// 获取根节点对象@SuppressWarnings("unchecked")Iterator<Element> it = ele.elementIterator();// 从根节点中获取子节点while (it.hasNext()) {Element ite = it.next();String brandName = ite.attributeValue("name");// 读取品牌名称@SuppressWarnings("unchecked")Iterator<Element> itType = ite.elementIterator();// 品牌下所有手机型号节点while (itType.hasNext()) {Element itT = itType.next();String type = itT.attributeValue("name");// String type=itT.getStringValue();//读取文本格式System.out.println(brandName + "   " + type);}}}private void loadDocument() {SAXReader sr = new SAXReader();try {// 接收读到的文件doc = sr.read("src/com/cn/xml/new.xml");} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

                                             
0 1
原创粉丝点击