Java之DOM解析XML文件

DOM解析XML文件

DOM:Document Object Model:文档对象模型.

特点

  • 在加载的时候,一次性的把整个XML文档加载到内存,在内存中形成一棵树(Document对象),在以后使用代码操作Document,其实就是操作的内存中的DOM树,和本地磁盘中的XML文件没有直接关系

缺点

  • 若XML文件过大,可能造成内存溢出
  • 性能比较低下

优点

  • 使用简单

DOM解析XMl文件分析

  • 对XMl文件的增删改查;

  • 查询

    1:获取文档对象
    2:获取根节点
    3:获取子节点
    4:获取子节点元素内容
    
  • 增加

    1:获取文档对象
    2:获取根节点
    3:通过文档对象创建要添加的节点
    4:给子节点设置值
    5:添加子节点到上一级节点
    6:添加上一级节点到文档的根节点
    7:数据同步
    
  • 修改

    1:获取文档对象
    2:获取根节点
    3:获取子节点
    4:修改子节点的值
    5:数据同步
    
  • 删除

    1:获取文档对象    
    2:获取根节点
    3:获取子节点
    4:通过根节点删除子节点
     :通过获取子节点的父节点,删除子节点
    5:数据同步
    

代码

 package com.dom._01;

 import java.io.File;

 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;

 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;

// DOM解析XML文件
public class DOMParesXml {

private File f = new File("D:/JavaApp/10-dom-sax/contacts.xml");

@Test
public void query() throws Exception {
    // 一、需求:得到某个具体的文本节点的内容:取出第二个联系人的名字
    Document doc = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder().parse(f);
    Element root = doc.getDocumentElement();
    Element item = (Element) root.getElementsByTagName("linkman").item(1);
    String content = item.getElementsByTagName("name").item(0)
            .getTextContent();
    System.out.println(content);
}

@Test
public void updateEmail() throws Exception {
    // 二、需求:修改某个元素节点的主体内容:把第一个联系人的邮箱改掉
    Document doc = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder().parse(f);
    Element root = doc.getDocumentElement();
    Element item = (Element) root.getElementsByTagName("linkman").item(0);
    Node email = item.getElementsByTagName("email").item(0);
    email.setTextContent("[email protected]");
    // 将数据同步到磁盘中
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.transform(new DOMSource(doc), new StreamResult(f));
}

@Test
public void save() throws Exception {
    // 需求:向指定元素节点中增加子元素节点:增加一个联系人信息
    Document doc = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder().parse(f);
    Element root = doc.getDocumentElement();
    // 创建新元素
    Element linkmanE1 = doc.createElement("linkman");
    Element nameE1 = doc.createElement("name");
    Element emailE1 = doc.createElement("email");
    Element addressE1 = doc.createElement("address");
    Element groupE1 = doc.createElement("group");
    // 给子元素设置文本内容
    nameE1.setTextContent("刘备");
    emailE1.setTextContent("刘备@河北.com");
    addressE1.setTextContent("河北");
    groupE1.setTextContent("三国");
    // 添加到linkmanE1
    linkmanE1.appendChild(nameE1);
    linkmanE1.appendChild(emailE1);
    linkmanE1.appendChild(addressE1);
    linkmanE1.appendChild(groupE1);
    // 添加到根节点
    root.appendChild(linkmanE1);
    // 将数据同步到磁盘的
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.transform(new DOMSource(doc), new StreamResult(f));

}

@Test
public void updateId() throws Exception {
    // 四、需求:操作XML文件属性:给第三个联系人设置/获取id属性
    Document doc = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder().parse(f);
    Element root = doc.getDocumentElement();
    Element item =(Element) root.getElementsByTagName("linkman").item(2);
    item.setAttribute("id", "110");
    //将数据同步到磁盘
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.transform(new DOMSource(doc), new StreamResult(f));
}

@Test
public void delete() throws Exception {
    // 五、删除指定元素节点:删除第三个联系人信息
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
    Element root = doc.getDocumentElement();
    Element linkmanE1 = (Element)root.getElementsByTagName("linkman").item(2);
    //删除节点
    //root.removeChild(linkmanE1);
    linkmanE1.getParentNode().removeChild(linkmanE1);
    //将数据同步到磁盘
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.transform(new DOMSource(doc), new StreamResult(f));
}
@Test
public void copyDoc() throws Exception {
    // 六、在内存中创建一个Document对象。
    File file = new File("F:/abc.xml");
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
    doc.setXmlVersion("1.0");                       //设置版本
    Element root = doc.createElement("abc");        //创建根节点
    doc.appendChild(root);                          //添加根节点
    //将数据同步到磁盘
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.transform(new DOMSource(doc), new StreamResult(file));
}

}

你可能感兴趣的:(学习笔记,java)