Java中DOM解析XML文件的方法有哪些?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2004个文字,预计阅读时间需要9分钟。
Java解析XML,有四种常见方法:DOM、SAX、JDOM、DOM4j。以下是对其中DOM方法的介绍及代码分析:
DOM(文档对象模型)是一种将XML或HTML文档表示为树形结构的方法。它允许开发者通过树形结构访问和操作文档中的元素。
DOM方法介绍
1. DOM解析XML: - 将整个XML文档加载到内存中,形成一个树形结构。 - 通过DOM树,可以方便地访问和修改XML文档中的元素。
2. DOM方法优点: - 完整性:可以一次性加载整个文档。 - 易于操作:可以方便地修改文档结构。
3. DOM方法缺点: - 内存消耗大:需要将整个文档加载到内存中。 - 解析速度慢:解析整个文档需要时间。
代码分析
以下是一个使用DOM解析XML的简单示例:
javaimport javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;
public class DOMExample { public static void main(String[] args) { try { // 创建DocumentBuilderFactory实例 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); // 创建DocumentBuilder实例 DocumentBuilder builder=factory.newDocumentBuilder(); // 解析XML文件 Document document=builder.parse(example.xml);
// 获取根元素 Element root=document.getDocumentElement();
// 获取所有book元素 NodeList bookList=root.getElementsByTagName(book);
// 遍历book元素 for (int i=0; i 在上面的代码中,我们首先创建了一个`DocumentBuilderFactory`实例,然后创建了一个`DocumentBuilder`实例。使用`builder.parse()`方法解析XML文件,并将解析结果存储在`Document`对象中。然后,我们通过`getElementsByTagName()`方法获取所有`book`元素,并遍历它们,打印出每个`book`元素的`author`属性值。 一、Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的;jaxp只是api,它进一步封装了sax、dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器)。如果是嵌入式的情况下建议使用sax方法进行解析,因为它不需要一下子把数据都保存到内存中然后再解析是可以逐步解析的。而DOM不行,必须一次性把数据存到内存中,然后一并解析。这样做虽然速度会很快,但是同时也加大了对内存的消耗。如果文件很大的情况下不建议DOM解析。 二、 1、 由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。 下面一段是DOM解析xml的一个案例一起来看一下。
<?xml version = "1.0" encoding = "UTF-8"?>
<staffs>
<staff id="1">
<name>Tom_zhang1</name>
<age>19</age>
<sex>男</sex>
<phone>18677435526</phone>
<group>
<id>1</id>
<name>Technical department</name>
</group>
</staff>
<staff id="2">
<name>Susy_wang</name>
<age>18</age>
<sex>女</sex>
<phone>18962459987</phone>
<group>
<id>2</id>
<name>Financial department</name>
</group>
</staff>
<staff id="3">
<name>Jack_Ma</name>
<age>45</age>
<sex>男</sex>
<phone>1867755334</phone>
<group>
<id>3</id>
<name>Financial department</name>
</group>
</staff>
</staffs>
Staff 类
package Entity;
public class Staff {
private int id;
private String name;
private int age;
private String sex;
private String phone;
private StuGroup group;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public StuGroup getGroup() {
return group;
}
public void setGroup(StuGroup group) {
this.group = group;
}
public Staff() {
super();
// TODO Auto-generated constructor stub
}
public Staff(int id, String name, int age, String sex, String phone,
StuGroup group) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.phone = phone;
this.group = group;
}
@Override
public String toString() {
return "Staff [age=" + age + ", group=" + group + ", id=" + id
+ ", name=" + name + ", phone=" + phone + ", sex=" + sex + "]";
}
}
Group 类
package Entity;
public class Group {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Group() {
super();
// TODO Auto-generated constructor stub
}
public Group(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Group [id=" + id + ", name=" + name + "]";
}
}
注释: Staff类不需解释,xml文件中有几个<>就需要创建几个字段。Group类的创建是因为group本身又是一个节点,它有它自己的字段。因此在这边把这种情况单独作为一个类创建,同时也方便日后维护管理。依次类推如果有更多的子类,方法一样创建相应的类即可。 无论是DOM解析还是SAX解析,都是通过一个叫做Parser的解释器,来对xml文件进行解析。而这个解析器是需要我们手动创建的,接下来就一起来看一下解释器中的代码,也是最主要的代码。 Dom_parser(解析器)
package Parser;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import Entity.StuGroup;
import Entity.Staff;
public class Dom_parser {
public static List<Staff> parser(String fileName) {
List<Staff> staffs = new ArrayList<Staff>(); //创建一个ArrayList来装数据
DocumentBuilderFactory factory = null; //DocumentBuilderFactory,DocumentBuilder,Document分别是DOM解析的工厂类
DocumentBuilder builder = null;
Document doc = null;
Staff staff = null; //方便日后实例化
StuGroup group = null; //同上
try {
factory = DocumentBuilderFactory.newInstance(); //工厂类实例化
builder = factory.newDocumentBuilder(); //工厂类实例化
doc = builder.parse(new File(fileName)); //通过.parser方法加载文件
Element root = doc.getDocumentElement(); //Element方法中的.getDocumentElement()代表获取xml文件的头文件内容
NodeList nodelist = root.getElementsByTagName("staff"); //获取TagName,每一个<>中的字段为一个TagName.作为一个nodelist来保存
//循环这个NodeList,然后得到每个nodelist中的item。根据获取到的值的索引最终通过.set方法得到这个值
for (int index = 0; index < nodelist.getLength(); index++) {
staff = new Staff();
Node node = nodelist.item(index);
staff.setId(Integer.parseInt(node.getAttributes().getNamedItem(
"id").getTextContent()));
// System.out.println(staff);
NodeList childNode = node.getChildNodes(); //设置一个childNode为了存放nodelist下子<>中的TagName
//同上循环子childNode这个list,获取到每个元素的下标。再通过.set方法分别得到每个元素的值。
for (int i = 0; i < childNode.getLength(); i++) {
Node childitem = childNode.item(i);
if (childitem.getNodeName().equals("name")) {
staff.setName(childitem.getTextContent());
} else if (childitem.getNodeName().equals("age")) {
staff.setAge(Integer.parseInt(childitem
.getTextContent()));
} else if (childitem.getNodeName().equals("sex")) {
staff.setSex(childitem.getTextContent());
} else if (childitem.getNodeName().equals("phone")) {
staff.setPhone(childitem.getTextContent());
} else if (childitem.getNodeName().equals("group")) {
NodeList groupnode = childitem.getChildNodes();
for (int j = 0; j < groupnode.getLength(); j++) {
Node groupitem = groupnode.item(j);
if (groupitem.getNodeName().equals("id")) {
group = new StuGroup(); //这里的实例化很重要,切记不要实例化错误地方
String groupId = groupitem.getTextContent();
group.setId(Integer.parseInt(groupId));
staff.setGroup(group);
} else if (groupitem.getNodeName().equals("name")) {
String groupName = groupitem.getTextContent();
group.setName(groupName);
staff.setGroup(group);
}
}
}
}
staffs.add(staff); //最终我们要把staff这个对象追加到staffs这个集合中。
}
} 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();
}
return staffs; //返回这个集合
}
}
package Parser;
import java.util.List;
import Entity.Staff;
public class Test {
public static void main(String[] args) {
String file = "C:/Users/IBM_ADMIN/Desktop/xml/staff.xml"; //指定文件地址
List<Staff> staffs = Dom_parser.parser(file); //因为我们创建的解析器的名字叫Dom_parser所以在这里调用Dom_parser.parser()方法。()中参数为文件地址。 //循环并打印结果
for(Staff list:staffs){
System.out.println(list);
}
}
}
打印结果如下。可以看到xml中每个TageName以及对应的值,通过DOM解析的方式把结果都一一的被获取并打印出来了。 目前我们是把数据放到了ArrayList内存中。后续可以把数据存放到数据库中。 Staff [age=19, group=Group [id=1, name=Technical department], id=1, name=Tom_zhang1, phone=18677435526, sex=男] 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
Staff [age=18, group=Group [id=2, name=Financial department], id=2, name=Susy_wang, phone=18962459987, sex=女]
Staff [age=45, group=Group [id=3, name=Financial department], id=3, name=Jack_Ma, phone=1867755334, sex=男]
本文共计2004个文字,预计阅读时间需要9分钟。
Java解析XML,有四种常见方法:DOM、SAX、JDOM、DOM4j。以下是对其中DOM方法的介绍及代码分析:
DOM(文档对象模型)是一种将XML或HTML文档表示为树形结构的方法。它允许开发者通过树形结构访问和操作文档中的元素。
DOM方法介绍
1. DOM解析XML: - 将整个XML文档加载到内存中,形成一个树形结构。 - 通过DOM树,可以方便地访问和修改XML文档中的元素。
2. DOM方法优点: - 完整性:可以一次性加载整个文档。 - 易于操作:可以方便地修改文档结构。
3. DOM方法缺点: - 内存消耗大:需要将整个文档加载到内存中。 - 解析速度慢:解析整个文档需要时间。
代码分析
以下是一个使用DOM解析XML的简单示例:
javaimport javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;
public class DOMExample { public static void main(String[] args) { try { // 创建DocumentBuilderFactory实例 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); // 创建DocumentBuilder实例 DocumentBuilder builder=factory.newDocumentBuilder(); // 解析XML文件 Document document=builder.parse(example.xml);
// 获取根元素 Element root=document.getDocumentElement();
// 获取所有book元素 NodeList bookList=root.getElementsByTagName(book);
// 遍历book元素 for (int i=0; i 在上面的代码中,我们首先创建了一个`DocumentBuilderFactory`实例,然后创建了一个`DocumentBuilder`实例。使用`builder.parse()`方法解析XML文件,并将解析结果存储在`Document`对象中。然后,我们通过`getElementsByTagName()`方法获取所有`book`元素,并遍历它们,打印出每个`book`元素的`author`属性值。 一、Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的;jaxp只是api,它进一步封装了sax、dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器)。如果是嵌入式的情况下建议使用sax方法进行解析,因为它不需要一下子把数据都保存到内存中然后再解析是可以逐步解析的。而DOM不行,必须一次性把数据存到内存中,然后一并解析。这样做虽然速度会很快,但是同时也加大了对内存的消耗。如果文件很大的情况下不建议DOM解析。 二、 1、 由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。 下面一段是DOM解析xml的一个案例一起来看一下。
<?xml version = "1.0" encoding = "UTF-8"?>
<staffs>
<staff id="1">
<name>Tom_zhang1</name>
<age>19</age>
<sex>男</sex>
<phone>18677435526</phone>
<group>
<id>1</id>
<name>Technical department</name>
</group>
</staff>
<staff id="2">
<name>Susy_wang</name>
<age>18</age>
<sex>女</sex>
<phone>18962459987</phone>
<group>
<id>2</id>
<name>Financial department</name>
</group>
</staff>
<staff id="3">
<name>Jack_Ma</name>
<age>45</age>
<sex>男</sex>
<phone>1867755334</phone>
<group>
<id>3</id>
<name>Financial department</name>
</group>
</staff>
</staffs>
Staff 类
package Entity;
public class Staff {
private int id;
private String name;
private int age;
private String sex;
private String phone;
private StuGroup group;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public StuGroup getGroup() {
return group;
}
public void setGroup(StuGroup group) {
this.group = group;
}
public Staff() {
super();
// TODO Auto-generated constructor stub
}
public Staff(int id, String name, int age, String sex, String phone,
StuGroup group) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.phone = phone;
this.group = group;
}
@Override
public String toString() {
return "Staff [age=" + age + ", group=" + group + ", id=" + id
+ ", name=" + name + ", phone=" + phone + ", sex=" + sex + "]";
}
}
Group 类
package Entity;
public class Group {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Group() {
super();
// TODO Auto-generated constructor stub
}
public Group(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Group [id=" + id + ", name=" + name + "]";
}
}
注释: Staff类不需解释,xml文件中有几个<>就需要创建几个字段。Group类的创建是因为group本身又是一个节点,它有它自己的字段。因此在这边把这种情况单独作为一个类创建,同时也方便日后维护管理。依次类推如果有更多的子类,方法一样创建相应的类即可。 无论是DOM解析还是SAX解析,都是通过一个叫做Parser的解释器,来对xml文件进行解析。而这个解析器是需要我们手动创建的,接下来就一起来看一下解释器中的代码,也是最主要的代码。 Dom_parser(解析器)
package Parser;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import Entity.StuGroup;
import Entity.Staff;
public class Dom_parser {
public static List<Staff> parser(String fileName) {
List<Staff> staffs = new ArrayList<Staff>(); //创建一个ArrayList来装数据
DocumentBuilderFactory factory = null; //DocumentBuilderFactory,DocumentBuilder,Document分别是DOM解析的工厂类
DocumentBuilder builder = null;
Document doc = null;
Staff staff = null; //方便日后实例化
StuGroup group = null; //同上
try {
factory = DocumentBuilderFactory.newInstance(); //工厂类实例化
builder = factory.newDocumentBuilder(); //工厂类实例化
doc = builder.parse(new File(fileName)); //通过.parser方法加载文件
Element root = doc.getDocumentElement(); //Element方法中的.getDocumentElement()代表获取xml文件的头文件内容
NodeList nodelist = root.getElementsByTagName("staff"); //获取TagName,每一个<>中的字段为一个TagName.作为一个nodelist来保存
//循环这个NodeList,然后得到每个nodelist中的item。根据获取到的值的索引最终通过.set方法得到这个值
for (int index = 0; index < nodelist.getLength(); index++) {
staff = new Staff();
Node node = nodelist.item(index);
staff.setId(Integer.parseInt(node.getAttributes().getNamedItem(
"id").getTextContent()));
// System.out.println(staff);
NodeList childNode = node.getChildNodes(); //设置一个childNode为了存放nodelist下子<>中的TagName
//同上循环子childNode这个list,获取到每个元素的下标。再通过.set方法分别得到每个元素的值。
for (int i = 0; i < childNode.getLength(); i++) {
Node childitem = childNode.item(i);
if (childitem.getNodeName().equals("name")) {
staff.setName(childitem.getTextContent());
} else if (childitem.getNodeName().equals("age")) {
staff.setAge(Integer.parseInt(childitem
.getTextContent()));
} else if (childitem.getNodeName().equals("sex")) {
staff.setSex(childitem.getTextContent());
} else if (childitem.getNodeName().equals("phone")) {
staff.setPhone(childitem.getTextContent());
} else if (childitem.getNodeName().equals("group")) {
NodeList groupnode = childitem.getChildNodes();
for (int j = 0; j < groupnode.getLength(); j++) {
Node groupitem = groupnode.item(j);
if (groupitem.getNodeName().equals("id")) {
group = new StuGroup(); //这里的实例化很重要,切记不要实例化错误地方
String groupId = groupitem.getTextContent();
group.setId(Integer.parseInt(groupId));
staff.setGroup(group);
} else if (groupitem.getNodeName().equals("name")) {
String groupName = groupitem.getTextContent();
group.setName(groupName);
staff.setGroup(group);
}
}
}
}
staffs.add(staff); //最终我们要把staff这个对象追加到staffs这个集合中。
}
} 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();
}
return staffs; //返回这个集合
}
}
package Parser;
import java.util.List;
import Entity.Staff;
public class Test {
public static void main(String[] args) {
String file = "C:/Users/IBM_ADMIN/Desktop/xml/staff.xml"; //指定文件地址
List<Staff> staffs = Dom_parser.parser(file); //因为我们创建的解析器的名字叫Dom_parser所以在这里调用Dom_parser.parser()方法。()中参数为文件地址。 //循环并打印结果
for(Staff list:staffs){
System.out.println(list);
}
}
}
打印结果如下。可以看到xml中每个TageName以及对应的值,通过DOM解析的方式把结果都一一的被获取并打印出来了。 目前我们是把数据放到了ArrayList内存中。后续可以把数据存放到数据库中。 Staff [age=19, group=Group [id=1, name=Technical department], id=1, name=Tom_zhang1, phone=18677435526, sex=男] 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
Staff [age=18, group=Group [id=2, name=Financial department], id=2, name=Susy_wang, phone=18962459987, sex=女]
Staff [age=45, group=Group [id=3, name=Financial department], id=3, name=Jack_Ma, phone=1867755334, sex=男]

