1.什么是XML文件?
概述: XML全称为Extensible Markup Language 可扩展性标记语言,可以实现不同系统之间的数据交换。
作用:通常用来配置文件、传送数据、存储数据
2.XML文件格式
XML中的特殊字符必须进行转义
特殊字符 | 转义字符 |
< | < |
> | > |
" | " |
& | & |
' | ' |
文本嵌套标签文本的话要通过 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执行结果