XML操作
HTML与XML区别
Html:超文本标记语言,属于解析型语言,不需要编译就可以运行,浏览器可以直接解析,一个网页从服务器到浏览器就是通过发送Html文件格式,采用标签来存储数据,作用是用来展示数据,不区分大小写
XML:可扩展性标记语言,用于存储数据,XML文件格式非常有利于计算机之间的数据传送,区分大小写,由开始标签和结束标签构成,有且只有一个根节点
DTD
文档类型的定义,用于约束XML,内容包括,元素定义规则,属性定义规则,元素之间的关系
?:0-1次子元素
*:0-N次子元素
+:1-N次子元素
DOM解析
dom:Document Object Model 文档对象模型
主要对象
1. Document:表示整个XML文档
[1] getElementByTagName(String),
[2] getDocumentElement()//得到根节点
2. NodeList:表示XML文档节点集合
[1] item(index)
3. Node:表示XML文档节点
[1] getChildNodes()
[2] getNodeName()
[3] getNodeValue()
[4] getTextContent()
4. Element:表示文档元素,与node对等
[1] getAttribute(attr_name:String)
解析过程:
DOM加载xml
static {
// 1.创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.根据解析器工厂获得解析器对象
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
//加载XML文档
document = builder.parse(path);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
DOM查询
public void show() {
//Element root = document.getDocumentElement();//取出根节点
NodeList list = document.getElementsByTagName("student");//取出所有的student标签
System.out.println("node sum : " + list.getLength());
System.out.println("===================================");
for(int i=0; i<list.getLength(); i++) {
Node node = list.item(i);
//取节点的属性必须转换为Element对象
Element element = (Element)node;
System.out.println("id = " + element.getAttribute("id"));
for(Node n = node.getFirstChild(); n != null; n = n.getNextSibling()) {
if(n.getNodeType() == Node.ELEMENT_NODE) {
if(!n.getNodeName().equals("scores")) {
System.out.println(n.getNodeName() + " = " + n.getFirstChild().getTextContent());
} else {
System.out.println(n.getNodeName() + " :");
int flag = 1;
for(Node cn = n.getFirstChild(); cn != null; cn = cn.getNextSibling() ) {
if(cn.getNodeType() == Node.ELEMENT_NODE) {
System.out.println("\t" + cn.getNodeName() + "_" + (flag++) + " = " + cn.getTextContent());
}
}
}
}
}
System.out.println("===================================");
}
}
DOM保存节点
//保存 dom 到 xml 文档,问题:不会保存 dtd 约束
public void save() {
TransformerFactory factory = TransformerFactory.newInstance();
try {
Transformer transformer = factory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(path);
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
DOM添加
//向 xml文件添加一个节点
public void add() {
String name = "赵珊珊";
String id = "1004";
String sex = "女";
String age = "20";
String phone = "15874862470";
// 创建 student 节点
Element element = document.createElement("student");
// 创建 id 属性并赋值
Attr idAttr = document.createAttribute("id");
idAttr.setValue(id);
//把 id 属性加入到 student 节点中
element.setAttributeNode(idAttr);
//创建 name 子节点
Element nameEle = document.createElement("name");
nameEle.setTextContent(name);
element.appendChild(nameEle);
//创建 sex 子节点
Element sexEle = document.createElement("sex");
sexEle.setTextContent(sex);
element.appendChild(sexEle);
//创建 age 子节点
Element ageEle = document.createElement("age");
ageEle.setTextContent(age);
element.appendChild(ageEle);
//创建 phone 子节点
Element phoneEle = document.createElement("phone");
phoneEle.setTextContent(phone);
element.appendChild(phoneEle);
//把 student 节点加入到根节点的子节点中
document.getDocumentElement().appendChild(element);
//保存 dom 到 xml 文件中
save();
}
DOM删除
public void delete() {
String id = "1004";
//取所有的 Student 节点集合
NodeList list = document.getElementsByTagName("student");
//循环每一个 student 节点
for(int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
Element e = (Element) n;
//取得节点的 id 值
String idStr = e.getAttribute("id");
//如果当前节点 id 与要删除的接的的 id 匹配
if(idStr.equals(id)) {
//用当前节点的父节点来移除子节点
n.getParentNode().removeChild(n);
break;
}
}
//更新文档
save();
}
DOM修改
public void update() {
String id = "1004";
//取所有的 Student 节点集合
NodeList list = document.getElementsByTagName("student");
//循环每一个 student 节点
for(int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
Element e = (Element) n;
//取得节点的 id 值
String idStr = e.getAttribute("id");
//如果当前节点 id 与要删除的接的的 id 匹配
if(idStr.equals(id)) {
//用当前节点的父节点来移除子节点
for(Node cn = n.getFirstChild(); cn != null; cn = cn.getNextSibling() ) {
if(cn.getNodeType() == Node.ELEMENT_NODE) {
if(cn.getNodeName().equals("name")) {
cn.setTextContent("另一个人");
}
}
}
break;
}
}
//更新文档
save();
}
DOM4J解析
package com.etc.homework.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class StudentManage {
static Document document;
static String path = "test/xml/student.xml";
static {
SAXReader reader = new SAXReader();
try {
document = reader.read(new File(path));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public void show() {
//通过 document 对象获取根节点
Element root = document.getRootElement();
//通过 elements() 方法获取当前节点的所有子节点
List<Element> list = root.elements();
//遍历子节点集合,
for(Element student : list) {
//获得叫 id 的属性并取得属性值,输出
System.out.println("id : " + student.attribute("id").getValue());
List<Element> elements = student.elements();
//遍历 student 节点下的所有子节点
for (Element el : elements) {
//如果是 scores 节点,则继续深度搜索,否则输出节点名和节点值
if(el.getName().equals("scores")) {
List<Element> scores = el.elements();
System.out.print( el.getName() +" : " );
for(Element score : scores) {
System.out.print( " " +score.getTextTrim() );
}
System.out.println();
} else System.out.println( el.getName() +" : "+el.getTextTrim() );
}
System.out.println();
}
}
public void add(Student stu) {
//获取根元素并为根元素创建一个子元素
Element root = document.getRootElement();
Element student = root.addElement("student");
//给子元素设置属性 id, 值为 1004
student.addAttribute("id", stu.getId());
//给 student 子元素添加子元素并添加文本
Element el = student.addElement("name");
el.setText(stu.getName());
student.addElement("sex").setText(stu.getSex());
student.addElement("age").setText(stu.getAge());
student.addElement("phone").setText(stu.getPhone());
//保存
save();
}
@SuppressWarnings("unchecked")
public void update(Student stu) {
//获取根元素并为根元素创建一个子元素
Element root = document.getRootElement();
//得到根元素的所有子节点
List<Element> list = root.elements();
//遍历子元素集合
for(Element student : list) {
//如果当前元素节点的id属性的值与要修改的id的值一致
if(student.attribute("id").getValue().equals(stu.getId())) {
//得到该元素下的所有子元素节点
List<Element> params = student.elements();
//遍历子元素节点并按对应位置修改值
for(Element param : params) {
String type = param.getName();
if(type.equals("name")) {
param.setText(stu.getName());
} else if(type.equals("sex")) {
param.setText(stu.getSex());
} else if(type.equals("age")) {
param.setText(stu.getAge());
} else if(type.equals("phone")) {
param.setText(stu.getPhone());
}
}
}
}
//保存dom到xml
save();
}
@SuppressWarnings("unchecked")
public void delete(String id) {
//获取根元素并为根元素创建一个子元素
Element root = document.getRootElement();
//根据根元素获取子元素节点集合
List<Element> list = root.elements();
//遍历集合并找到与要删除的元素节点id一致的节点
for(Element student : list) {
if(student.attribute("id").getValue().equals(id)) {
//通过该节点的父节点元素删除该节点元素
student.getParent().remove(student);
}
}
//保存dom到xml
save();
}
private void save() {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");//指定保存的XML文件编码
XMLWriter writer = null;
try {
writer = new XMLWriter(new FileOutputStream(path), format);
writer.write(document);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}