读取的xml文件如下:
根层次为company,下面二层次为apartment,其下三层次为staff,其下为staff的特征值。
为便于理解,命令、解读均以此为准。
原文如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<apartment id="1">
<staff id="001">
<name>001老大</name>
<age>40</age>
</staff>
</apartment>
<apartment id="2">
<staff id="002">
<name>002老大</name>
<age>50</age>
</staff>
</apartment>
</company>
第一种方法:DOM方法
package xml.read;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class ReadXmlByDom {
public void readXMLByDom() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
//解析器整个解析,读入内存,然后再进行后期的操作
//根层次,表达公司信息
Document company = builder.parse(new File("company.xml"));
NodeList apartmentList = company.getElementsByTagName("apartment");//获取部门信息
//第二层次,对公司内部的每个部门进行解析
int index = 0;
for (int i = 0; i < apartmentList.getLength(); i++) {
Node apartment = apartmentList.item(i);//获取第一个部门的信息
Node apartmentIDNode = apartment.getAttributes().getNamedItem("id");
int apartmentID = Integer.parseInt(apartmentIDNode.getNodeValue());
//第三层次,获取部门内的所有员工
NodeList staffs = apartment.getChildNodes();
for (int j = 0; j < staffs.getLength(); j++) {
//对每个员工信息进行记录
Staff staff = new Staff();
staff.setApartment(apartmentID);//设置部门ID
//去除掉冗余节点
if(!(staffs.item(j) instanceof Element))
continue;
Node staffNode = staffs.item(j);
Node staffIDNode = staffNode.getAttributes().getNamedItem("id");
int staffID = Integer.parseInt(staffIDNode.getNodeValue());
staff.setId(staffID);//设置员工ID
//不使用循环,直接获取指定节点的值,因为只有两个,就用个简单点的
//抱歉,为了成功获取所有节点,把index的赋值放到二层循环里面了
String name = company.getElementsByTagName("name").item(index).getTextContent();
staff.setName(name);
int age = Integer.parseInt(company.getElementsByTagName("age").item(index).getTextContent());
index++;
staff.setAge(age);
staff.print();
}
}
}
public static void main(String[] args) throws Exception{
new ReadXmlByDom().readXMLByDom();
}
}
//打印输出
//Apartment: 1 name: 001老大 id: 1 age: 40
//Apartment: 2 name: 002老大 id: 2 age: 50
class Staff {
String name;
int apartment, id, age;
public void setApartment(int apartment) {
this.apartment = apartment;
}
public void setName(String name) {
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setAge(int age) {
this.age = age;
}
public void print() {
System.out.println("Apartment: " + apartment + " name: " + name + " id: " + id + " age: " + age);
}
}
第二种方法:DOM4J
package xml.read;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
public class ReadXmlByDOM4J {
public void readXmlByDOM4J() throws Exception {
//获取整个DOM树
Document company = new SAXReader().read(new File("company.xml"));
//获取DOM树的迭代器
Iterator it = company.getRootElement().elementIterator();
//现在开始逐一对部门信息进行分析
while (it.hasNext()) {
Element apartment = (Element) it.next();//获取部门节点
//打印部门ID值
System.out.println("apartment ID = " + apartment.attributeValue("id"));
//因为xml文件里只有一个员工,不采取循环(不符合业务逻辑,用于尝试不同的方法)
Element staff = apartment.element("staff");//获取员工节点
//打印员工ID值
System.out.println("staff ID = " + staff.attributeValue("id"));
//打印员工姓名
System.out.println("staff name = " + staff.elementText("name"));
//打印员工年龄
System.out.println("staff age = " + staff.elementTextTrim("age"));
}
}
public static void main(String[] args) throws Exception {
new ReadXmlByDOM4J().readXmlByDOM4J();
}
}
打印输出信息如下:
apartment ID = 1
staff ID = 001
staff name = 001老大
staff age = 40
apartment ID = 2
staff ID = 002
staff name = 002老大
staff age = 50
第三种方法:JDOM
package xml.read;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import java.io.File;
import java.util.List;
public class ReadXmlByJDOM {
public void readXmlByJDOM() throws Exception {
//构建整个DOM树,获取company值
Document document = new SAXBuilder().build(new File("company.xml"));
Element company = document.getRootElement();
List<Element> apartments = company.getChildren();
for(Element apartment : apartments) {
//打印apartment的ID值
System.out.print("apartment ID = " + apartment.getAttributeValue("id"));
Element staff = apartment.getChild("staff");//只有一个员工
//打印员工ID name age
System.out.print(" staff ID = " + staff.getAttributeValue("id"));
System.out.print(" staff name = " + staff.getChildText("name"));
System.out.print(" staff age = " + staff.getChildText("age") + "\n");
}
}
public static void main(String[] args) throws Exception {
new ReadXmlByJDOM().readXmlByJDOM();
}
}
输出信息如下:
apartment ID = 1 staff ID = 001 staff name = 001老大 staff age = 40
apartment ID = 2 staff ID = 002 staff name = 002老大 staff age = 50
第四种方法SAX
package xml.read;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class ReadXmlBySAX {
public void readXMLBySAX() throws Exception{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File("company.xml"), new ReadHandler());
}
public static void main(String[] args) throws Exception{
new ReadXmlBySAX().readXMLBySAX();
}
}
package xml.read;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ReadHandler extends DefaultHandler {
Staff staff = new Staff();//用于记录每个员工的信息
String tagName;//全局变量,记录标签名
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
if (qName.equals("apartment"))
//如果节点是apartment,则读取id到staff里面
staff.setApartmentID(Integer.parseInt(attributes.getValue("id")));
else if (qName.equals("staff"))
staff.setStaffID(Integer.parseInt(attributes.getValue("id")));
tagName = qName;
}
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
String text = new String(ch, start, length);
if (tagName == null || text.contains("\n")) //text会获取换行符,所以需要另外去掉
return;
if (tagName.equals("name"))
staff.setName(text);
else if (tagName.equals("age"))
staff.setAge(Integer.parseInt(text));
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals("staff")) {
staff.Print();
}
}
}
class Staff {
int apartmentID, staffID, age;
String name;
public void setApartmentID(int apartmentID) {
this.apartmentID = apartmentID;
}
public void setStaffID(int staffID) {
this.staffID = staffID;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void Print() {
System.out.print("apartment id = " + apartmentID + " staff id = " + staffID + " name = " + name + " age = " + age + "\n");
}
}
效果图如下:
apartment id = 1 staff id = 1 name = 001老大 age = 40
apartment id = 2 staff id = 2 name = 002老大 age = 50