0
点赞
收藏
分享

微信扫一扫

32、JAVA进阶——解析XML技术


目录

​​1、DOM解析XML​​

​​   (1)DOM介绍​​

​​    (2)常用接口介绍​​

​​    (3)DOM解析XML文件步骤​​

​​    (4)保存XML文件步骤 ​​

​​    (5)查询输出XML文件中的信息​​

​​    (6)向XML文件中添加数据​​

​​    (7)删除xml文件里面的数据​​

​​    (8)修改XML里面的数据​​

​​2、DOM4J解析XML​​

32、JAVA进阶——解析XML技术_xml文件

1、DOM解析XML

   (1)DOM介绍

                文档对象模型(Document Object Model)

                DOM把XML文档映射成一个倒挂的树

                示例:

32、JAVA进阶——解析XML技术_xml_02

    (2)常用接口介绍

                DOM解析包:org.w3c.dom

32、JAVA进阶——解析XML技术_xml文件_03

    (3)DOM解析XML文件步骤

          1)创建解析器工厂对象

          2)解析器工厂对象创建解析器对象

          3)解析器对象指定XML文件创建Document对象

操作DOM

Document document;
// 声明方法获得Document对象的
public void getDocument(File file) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
document = db.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

    (4)保存XML文件步骤 

                1)获得TransformerFactory对象

                2)创建Transformer对象

                3)创建DOMSource对象

                        包含XML信息

                4)设置输出属性

                        编码格式

                5)创建StreamResult对象

                        包含保存文件的信息

                6)将XML保存到指定文件中

//声明保存XML的方法
public void saveXml(String url){
//保存XML文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
//设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(new FileOutputStream(url));
//把DOM转换为XML文件
transformer.transform(domSource, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}

}

    (5)查询输出XML文件中的信息

public void printInfo() {
// 获取收藏信息.xml文件中所有的Brand元素,可能会获取多个,所以将获取的元素存放在NodeList集合中
NodeList nl = document.getElementsByTagName("Brand");
for (int i = 0; i < nl.getLength(); i++) {
// 将节点集合中的元素取出来
Node node = nl.item(i);
Element brand = (Element) node;
String nameVlue = brand.getAttribute("name");
System.out.println(nameVlue);
NodeList typeNodes = brand.getChildNodes();
for (int j = 0; j < typeNodes.getLength(); j++) {
Node typeNode = typeNodes.item(j);
// 类型判断,如果typeNode能够转换成Element,才进行转换和输出
if (typeNode.getNodeType() == Node.ELEMENT_NODE) {
Element type = (Element) typeNode;
String typeValue = type.getAttribute("name");
System.out.println("\t" + typeValue);
}

}
}
}

    (6)向XML文件中添加数据

//声明向XML文件中添加数据的方法
public void addXml(){
//创建Brand节点
Element brandElement = document.createElement("Brand");
brandElement.setAttribute("name", "MOTO");
//创建Type节点
Element typeElement = document.createElement("Type");
typeElement.setAttribute("name", "A1680");
//添加父子关系
brandElement.appendChild(typeElement);
Element phoneElement = (Element)document.getElementsByTagName("PhoneInfo").item(0);
phoneElement.appendChild(brandElement);

//添加完毕之后要保存XML文件
saveXml("收藏信息.xml");
}

    (7)删除xml文件里面的数据

//删除xml文件里面的数据
public void deleteXml(){
//找到删除的节点
NodeList list = document.getElementsByTagName("Brand");
for (int i = 0; i < list.getLength(); i++) {
Element brandElement = (Element)list.item(i);
String brandName = brandElement.getAttribute("name");
if (brandName.equals("摩托罗拉")) {
brandElement.getParentNode().removeChild(brandElement);
}
}

saveXml("收藏信息.xml");
}

    (8)修改XML里面的数据

//修改XML里面的数据
public void updateXml(){
//找到修改的节点
NodeList list = document.getElementsByTagName("Brand");
for (int i = 0; i < list.getLength(); i++) {
Element brandElement = (Element)list.item(i);
String brandName = brandElement.getAttribute("name");
if (brandName.equals("MOTO")) {
brandElement.setAttribute("name", "摩托罗拉");//修改属性值
}
}

saveXml("收藏信息.xml");
}

2、DOM4J解析XML

32、JAVA进阶——解析XML技术_java_04

首先,下载dom4j的jar包,免费的下载官网:​​dom4j下载官网​​

然后导入到项目里,Build Path为可用文件

举例说明使用方法:

package cn.bdqn.demo03;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;



public class Dom4jXMLDemo01 {

public static Document doc;

public static void main(String[] args) {
loadDocument();
// showPhoneInfo();
addNewPhoneInfo();
// updatePhoneInfo();
// deleteItem();
showPhoneInfo();
}

public static void loadDocument(){
try{
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();
int id = 0;
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
if (brand.attributeValue("name").equals("华为")) {
brand.getParent().remove(brand);
}
}
saveXML("收藏信息.xml");
}

public static void showPhoneInfo() {
// 获取XML的根节点
Element root = doc.getRootElement();
// 遍历所有的Brand标签
for (Iterator itBrand = root.elementIterator(); itBrand.hasNext();) {
Element brand = (Element) itBrand.next();
// 输出标签的name属性
System.out.println("品牌:" + brand.attributeValue("name"));
// 遍历Type标签
for (Iterator itType = brand.elementIterator(); itType.hasNext();) {
Element type = (Element) itType.next();
// 输出标签的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("收藏信息.xml");
}
}


举报

相关推荐

0 条评论