XML解析
使用Java自带的DOM解析方式
public class XMLDemo {
public static void main(String[] args) {
// 使用java自带的DOM解析器来解析students.xml文件
// 获取文档构建器工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
// 通过工厂对象获取文档构建器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析xml文件,得到文档对象
Document doc = builder.parse(new File("src/....xml"));
// 通过文档对象获取xml的根元素节点
Element root = doc.getDocumentElement();
// 显示根元素
show(root);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void show(Node element) {
// 输出当前节点的信息
short type = element.getNodeType();
if (type == Node.ELEMENT_NODE) {
System.out.print("元素:");
System.out.println(element.getNodeName());
// 获取该元素的属性列表
NamedNodeMap map = element.getAttributes();
for (int i = 0; i < map.getLength(); i++) {
show(map.item(i));
}
// 检查该元素节点是否有子节点
// 获取子节点
NodeList list = element.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
show(list.item(i));
}
} else if (type == Node.ATTRIBUTE_NODE) {
System.out.print("属性:");
System.out.println(element.getNodeName() + "=" + element.getNodeValue());
} else if (type == Node.TEXT_NODE) {
String str = element.getNodeValue().trim();
if (str.length() > 0) {
System.out.print("文本:");
System.out.println(str);
}
} else if (type == Node.COMMENT_NODE) {
System.out.print("注释:");
System.out.println(element.getNodeValue());
}
}
}
使用dom4j解析xml文档:
public class Dom4jDemo {
public static void main(String[] args) {
// 创建读取器对象
SAXReader reader = new SAXReader();
try {
// 解析xml文件,得到文档对象
Document doc = reader.read(new File("src/students.xml"));
// 获取根元素节点
Element root = doc.getRootElement();
// 显示节点的内容
show(root);
} catch (DocumentException e) {
e.printStackTrace();
}
}
private static void show(Element element) {
// 显示元素节点的信息
System.out.println("元素:" + element.getName());
// 元素的属性
List<Attribute> attList = element.attributes();
Attribute attr;
for (int i = 0; i < attList.size(); i++) {
attr = attList.get(i);
System.out.println(attr.getName() + "=" + attr.getValue());
}
// 元素的文本内容
String text = element.getText().trim();
if (text.length() > 0) {
System.out.println("元素的文本内容:" + element.getText());
}
// 子元素
List<Element> eleList = element.elements();
for (int i = 0; i < eleList.size(); i++) {
show(eleList.get(i));
}
}
}
根据学生的学号查找xml中的学生信息,返回Student对象:
public class Dom4jDemo2 {
public static void main(String[] args) {
Student stu = findByStuId("s005");
if (stu == null) {
System.out.println("s005学号不存在!");
} else {
System.out.println(stu);
}
}
/**
* 直接查找学号为s001的学生的信息,返回Student对象
*
*/
public static Student findByStuId(String stuId) {
Student stu = null;
try {
Document doc = new SAXReader().read(new File("src/students.xml"));
List<Element> elements = doc.getRootElement().elements("student");
Element ele;
for (int i = 0; i < elements.size(); i++) {
// student元素
ele = elements.get(i);
if (ele.attribute("id").getValue().equals(stuId)) {
stu = new Student();
stu.setName(ele.elements("name").get(0).getText());
stu.setAge(Integer.parseInt(ele.elements("age").get(0).getText()));
stu.setMobile(ele.elements("mobile").get(0).getText());
stu.setAddress(ele.elements("address").get(0).getText());
// 获取hobby元素的列表
List<Element> hobbies = ele.elements("hobby");
// 用来存放爱好字符串的列表
List<String> list = new ArrayList<>();
// 对hobby元素列表进行循环处理
for (int j = 0; j < hobbies.size(); j++) {
list.add(hobbies.get(j).getText());
}
// 将爱好列表放入学生对象中
stu.setHobby(list);
return stu;
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
}
创建新的xml文档:
public class Dom4jDemo3 {
public static void main(String[] args) {
// 生成保存员工信息的xml文档
// 首先要获取文档对象
Document doc = DocumentHelper.createDocument();
// 添加xml注释
doc.add(DocumentHelper.createComment("学习如何通过dom4j新建xml文档"));
// 创建根元素节点对象
Element employees = DocumentHelper.createElement("employees");
// 给文档对象中设置根元素
doc.setRootElement(employees);
// 准备数据
String[] ids = { "e01", "e02", "e03" };
String[] names = { "张三", "李四", "王五" };
String[] dobs = { "1999-09-08", "1999-12-14", "1987-12-20" };
String[] genders = { "男", "女", "男" };
String[] mobiles = { "13999999999", "13988888888", "13966666666" };
// 使用循环来添加三个employee子元素
for (int i = 0; i < 3; i++) {
// 创建第一个employee元素
Element empEle = DocumentHelper.createElement("employee");
// 将ele设置为root的子元素
employees.add(empEle);
// 设置员工的属性
addAttribute(empEle, "id", ids[i]);
// 添加子元素
addChildElement(empEle, "name", names[i]);
addChildElement(empEle, "dob", dobs[i]);
addChildElement(empEle, "gender", genders[i]);
addChildElement(empEle, "mobile", mobiles[i]);
}
Writer writer = null;
try {
writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
// 美观格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 保存
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(doc);
// 关闭书写器
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static void addChildElement(Element parent, String eleName, String eleText) {
Element ele = DocumentHelper.createElement(eleName);
ele.setText(eleText);
parent.add(ele);
}
private static void addAttribute(Element ele, String attrName, String attrValue) {
ele.addAttribute(attrName, attrValue);
}
}
给现有的employees.xml中添加新员工:
public class Dom4jDemo4 {
public static void main(String[] args) {
// 给现有的employees.xml中添加新员工
Writer writer = null;
// 创建读取器对象
SAXReader reader = new SAXReader();
try {
Document doc = null;
// 读取并解析现有的xml文件
doc = reader.read(new File("employees.xml"));
// 获取根元素employees节点
Element employees = doc.getRootElement();
// 创建新的元素对象,封装新员工的信息
Element ele = DocumentHelper.createElement("employee");
// 设置属性
Utils.addAttribute(ele, "id", "e04");
// 添加子元素
Utils.addChildElement(ele, "name", "赵六");
Utils.addChildElement(ele, "dob", "1988-08-08");
Utils.addChildElement(ele, "gender", "女");
Utils.addChildElement(ele, "mobile", "13955555555");
// 将新元素添加到父元素的末尾
employees.add(ele);
// 保存
writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
xmlWriter.write(doc);
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
将子元素添加到指定的位置:
- 添加到首位。
public static void main(String[] args) {
// 给现有的employees.xml中添加新员工,指定位置
Writer writer = null;
// 创建读取器对象
SAXReader reader = new SAXReader();
try {
Document doc = null;
// 读取并解析现有的xml文件
doc = reader.read(new File("employees.xml"));
// 获取根元素employees节点
Element employees = doc.getRootElement();
// 创建新的元素对象,封装新员工的信息
Element ele = DocumentHelper.createElement("employee");
// 设置属性
Utils.addAttribute(ele, "id", "e05");
// 添加子元素
Utils.addChildElement(ele, "name", "刘华");
Utils.addChildElement(ele, "dob", "1965-12-08");
Utils.addChildElement(ele, "gender", "男");
Utils.addChildElement(ele, "mobile", "13989898989");
// 将新元素作为父元素的第一个子节点进行添加
employees.elements("employee").add(0,ele);
// 保存
writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
xmlWriter.write(doc);
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
修改现有xml文档中的内容:
将id="e05"的员工的姓名改为张友。
public static void main(String[] args) {
// 将id="e05"的员工的姓名改为张友。
Writer writer = null;
// 创建读取器对象
SAXReader reader = new SAXReader();
try {
Document doc = null;
// 读取并解析现有的xml文件
doc = reader.read(new File("employees.xml"));
// 获取根元素employees节点
Element employees = doc.getRootElement();
//获取员工employee元素列表
List<Element> empList=employees.elements();
//寻找id=e05的元素
Element ele;
for(int i=0;i<empList.size();i++) {
ele=empList.get(i);
//判断id属性的值是否为e05
if(ele.attribute("id").getValue().equals("e05")) {
//已经找到目标元素节点
//修改子元素name的值
ele.elements("name").get(0).setText("张友");
}
}
// 保存
writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
xmlWriter.write(doc);
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
删除现有xml文档中的元素节点:
- 删除id=e05的员工。
public static void main(String[] args) {
// 删除id=e05的员工。
Writer writer = null;
// 创建读取器对象
SAXReader reader = new SAXReader();
try {
Document doc = null;
// 读取并解析现有的xml文件
doc = reader.read(new File("employees.xml"));
// 获取根元素employees节点
Element employees = doc.getRootElement();
// 第一种方式,根据父节点中的方法进行删除,employees.remove(ele) //删除子元素节点
// 第二种方式,通过子节点的列表进行删除
// 获取员工employee元素列表
List<Element> empList = employees.elements();
// 寻找id=e05的元素
Element ele;
for (int i = 0; i < empList.size(); i++) {
ele = empList.get(i);
// 判断id属性的值是否为e05
if (ele.attribute("id").getValue().equals("e05")) {
// 已经找到目标元素节点
empList.remove(ele);
break;
}
}
// 保存
writer = new OutputStreamWriter(new FileOutputStream("employees.xml"), "utf-8");
XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
xmlWriter.write(doc);
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}