使用DOM和DOM4J解析XML文件(含代码)

1.什么是XML文件?

概述:   XML全称为Extensible Markup Language 可扩展性标记语言,可以实现不同系统之间的数据交换。

作用:通常用来配置文件、传送数据、存储数据

2.XML文件格式

      XML中的特殊字符必须进行转义

特殊字符 转义字符
<         &lt;
>        &gt;
"&quot;
&        &amp;
'                &apos;

文本嵌套标签文本的话要通过 CDATA节处理
   <![CDATA[讲解了元素<title>以及</title>的使用]]>  

3.定义XML文件

<?xml version="1.0" encoding="gb2312" standalone="no"?><PhoneInfo>
	<Brand name="华为">
		<Type name="P9"/>
	</Brand>
	<Brand name="苹果">
		<Type name="Iphone6"/>
		<Type name="Iphone7"/>
	</Brand>
  
</PhoneInfo>

4.使用DOM解析XML文件

4.1读取加载DOM树结构

//1.创建解析器工厂DocumentBuilderFactory对象
 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//2.由解析器工厂对象创建解析器DocumentBuilder对象
 DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
//3.读取并解析构建DOM树
 Document parse = documentBuilder.parse("02charpter/src/cn/bdqn/收藏信息.xml");

4.2解析读取树结构的节点

// 获取根节点
  Node firstChild = parse.getFirstChild();
//创建子节点brand
  Element brand1 = parse.createElement("brand");
//增加节点
  firstChild.appendChild(brand1);
  System.out.println(firstChild.getNodeName());
//将节点转为Element子对象: 因为node是包含空格的不好获取
  Element element = (Element) firstChild;
  NodeList brand = element.getElementsByTagName("Brand");
//循环遍历输出子节点属性及内容
  System.out.println("===========手机品牌=========");
   for (int i = 0; i < brand.getLength(); i++) {
            Element item = (Element) brand.item(i);
            String name = item.getAttribute("name");
            System.out.println(name);
            NodeList type = item.getElementsByTagName("Type");
            for (int j = 0; j < type.getLength(); j++) {
                    Element item1 = (Element) type.item(i);
                    String name1 = item1.getAttribute("name");
                    System.out.println(name1);
                }
            }

4.3DOM操作数据(增、删、改)

      对XML文件进行修改就需要先获取(读入)文件(DOM树结构),修改的信息还要通过TransFrom对象来输出,所以我们可以定义一个DomUntils类对这些常用结构进行封装

4.3.1获取XML文档树结构的封装

   /**
     * 创建DOM文档对象
     */
 public static Document createDocument() throws ParserConfigurationException {
      //1.创建解析器工厂DocumentBuilderFactory对象
      DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
      //2.由解析器工厂对象创建解析器DocumentBuilder对象
      DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
      Document document = documentBuilder.newDocument();
      return  document;
    }

4.3.2对XML修改文档的封装

  /**
     * 对xml文件的修改进行封装
     */
    public static void transform(Document document,String path) throws TransformerException, FileNotFoundException {
        //1.创建工厂对象
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        //2.获取Transformer对象
        Transformer transformer = transformerFactory.newTransformer();
        //3.设置编码格式
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        //4. 通过Document对象 创建DomSource
        DOMSource domSource = new DOMSource(document);
        FileOutputStream outputStream = new FileOutputStream(path);
        //5.创建StreamResult对象
        StreamResult streamResult = new StreamResult(outputStream);
        //6.生成新的xml文件
        transformer.transform(domSource, streamResult);
    }

4.3.3使用上述封装的方法来修改XML文档

  别忘记处理异常!!!

 //1.调用读取文件封装
   Document document = DOMUntils.getDocument("02charpter/src/cn/bdqn/收藏信息.xml");//XML文件路径
           
  //获取文档根节点
  Element firstChild = (Element) document.getFirstChild();

//2.修改节点或属性
  NodeList childNodes = firstChild.getChildNodes();
     for (int i = 0; i < childNodes.getLength(); i++) {
      //判断是否为文本节点类型
       if (childNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
              Element item = (Element) childNodes.item(i);
              //将name属性值为SAMSUNG的节点修改为三星
           if (item.getAttribute("name").equals("SAMSUNG")) {
                      item.setAttribute("name","三星");
              }
           //将name属性为Notex的节点修改为SAMSUNG
           NodeList type = item.getElementsByTagName("Type");
           for (int j = 0; j < type.getLength(); j++) {
                 Element item1 = (Element) type.item(j);
                   if(item1.getAttribute("name").equals("NoteX")){
                      item1.setAttribute("name","SAMSUNG");
                        }
                    }

                }
            }
          
  //3.调用transform输出DOM文档到另一个文件中
    DOMUntils.transform(document, "02charpter/src/cn/bdqn/新收藏信息.xml");

4.3.3使用上述封装的方法来删除指定XML文档

别忘记处理异常!!!

//1.调用读取文件封装
   Document document = DOMUntils.getDocument("02charpter/src/cn/bdqn/收藏信息.xml");//XML文件路径
           
//2.获取文档根节点
  Element firstChild = (Element) document.getFirstChild();
//3.删除节点或属性(属性为三星的节点)
    NodeList childNodes = firstChild.getChildNodes();
      for (int i = 0; i < childNodes.getLength(); i++) {
         if (childNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
                Element item = (Element) childNodes.item(i);
                  if (item.getAttribute("name").equals("三星")) {
                         firstChild.removeChild(item);
                    }
                }
            }
//4.调用transform输出DOM文档到另一个文件中
 DOMUntils.transform(document, "02charpter/src/cn/bdqn/新收藏信息.xml");

5.使用DOM4J解析XML文件

   定义DOM4JParse类,该类封装了使用DOM4j对文档的读取,增、删、改的方法。

5.1DOM4J加载DOM树

//将文档对象定义为成员变量,方便使用
Document read=null;

 /**
   * 加载DOM树
  */
 public void loadDocument() throws DocumentException {
     //1.创建解析器对象
      SAXReader saxReader = new SAXReader();
     //2.读取文件信息
      read = saxReader.read("02charpter/src/cn/bdqn/收藏信息.xml");
 }

5.2DOM4J解析DOM节点

/**
 * 显示所有信息
 */
public void showInfo(){
    Element root = doc.getRootElement();
	Iterator itBrand =root.elementIterator();
	while(itBrand.hasNext()){
	Element brandEle = (Element)itBrand.next();
	String brandStr = brandEle.attributeValue("name");
	Iterator itType = brandEle.elementIterator();
	    while(itType.hasNext()){
			Element typeEle = (Element)itType.next();
			String typeStr = typeEle.attributeValue("name");
			System.out.println("手机品牌:"+brandStr+",型号:"+typeStr);
		}
	}
}

5.3DOM4J添加DOM节点

/**
 * 添加节点信息(三星 Note4)
 */
  public void addPhoneInfo(){	
	 Element root = doc.getRootElement();
	 //创建一个brand节点
	 Element brandEle = root.addElement("Brand");
	 //给Brand节点设置属性
	 brandEle.addAttribute("name", "三星");
	 //创建Type节点
	 Element typeEle = brandEle.addElement("Type");
	 typeEle.addAttribute("name", "NoteX");
	 this.saveXML("新的收藏信息.xml");
	}

5.4DOM4J修改DOM节点

	/**
	 * 修改节点信息(为每下个brand节点添加一个id属性)
	 */
	public void modifyPhoneInfo(){
		Element root = doc.getRootElement();
		int id=0;
		Iterator itBrand = root.elementIterator();
		//遍历后获取每个brand节点
		while(itBrand.hasNext()){
			id++;
			Element brandEle = (Element)itBrand.next();
			brandEle.addAttribute("id", id+"");
		}
		this.saveXML("新的收藏信息.xml");
	}

5.5DOM4J删除DOM节点

	/**
	 * 删除节点信息(删除节点三星)
	 */
	public void delPhoneInfo(){
		Element root = doc.getRootElement();
		Iterator itBrand = root.elementIterator();
		while(itBrand.hasNext()){
			Element brandEle = (Element)itBrand.next();
			if(brandEle.attributeValue("name").equals("三星")){
				brandEle.getParent().remove(brandEle);
			}
		}
		this.saveXML("新的收藏信息.xml");
	}

5.6执行以上封装方法

public static void main(String[] args) {
		DOM4JParse parse = new DOM4JParse();
		parse.loadDocument();
		parse.addPhoneInfo();
		parse.showInfo();
		parse.modifyPhoneInfo();
		parse.delPhoneInfo();
		//parse.saveXML("新的收藏信息.xml");
	}

5.7执行结果

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值