java xml解析之dom解析

java语言本身支持DOM,可以直接查找属性与 子节点,过程大致如下:

1、通过工厂类创建对象,可以通过该对象创建文本对象

 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.通过工厂类的对象(dbf )创建文档对象,该对象可以映射操作xml文件

DocumentBuilder docum = dbf.newDocumentBuilder(); 
Document doc = docum.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("MyXML/Student.xml"));

3.获取文档中的所有节点,实现后面的对属性、值得获

NodeList nodelist = doc.getElementsByTagName("student");//这里的“student”为要获取节点的名称,返回的是节点的集合

4.遍历每个节点,获取节点的属性和节点的子节点,实现对应的操作。

例子:

先定义个一个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student score="23">
		<name>"张三"</name>
		<id>1003</id>
		<sex>女</sex>
	</student>
	
	<student score="24">
		<name>"李四"</name>
		<id>1004</id>
		<sex>男</sex>
	</student>
	
	<student id="1005">
		<name>"张五"</name>
		<score>25</score>
		<sex>男</sex>
	</student>

</students>

再定义一个Students类

public class Students {
	private int id;
	private int socre;
	private String name;
	private String sex;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getSocre() {
		return socre;
	}
	public void setSocre(int socre) {
		this.socre = socre;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "Students [id=" + id + ", socre=" + socre + ", name=" + name + ", sex=" + sex + "]";
	}	
}

最后进行XML解析

import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
//dom解析 
public class DomParse {
	public static void main(String[] args) throws Exception {
		//使用工厂类创建对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		//使用工厂类的对象创建文档对象,该对象映射操作xml文件
		DocumentBuilder docum = dbf.newDocumentBuilder();	
		Document doc = docum.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("MyXML/Student.xml"));
		//获取文档中所有的student节点,返回的是节点的集合
		NodeList nodelist = doc.getElementsByTagName("student");
		//定义List集合以便存储Srudents对象
		List<Students>list = new ArrayList<Students>();
		for(int i=0;i<nodelist.getLength();i++) {
			//新建Student对象以便存储XML文件信息
			Students stu = new Students();
			//使用item()遍历每个节点
			Node it = nodelist.item(i);
			//获取节点的属性,返回的是属性的集合
			NamedNodeMap att = it.getAttributes();
			//遍历每一个属性,如果与Student的属性相对应,则在stu中存入对应属性的值
			for(int j = 0;j<att.getLength();j++) {
				Node property = att.item(j);
				//getNodeName()获取属性的名称
				if("id".equals(property.getNodeName())) {
					//getTextContent()获取属性对应的名字
					stu.setId(Integer.parseInt(property.getTextContent()));
				}
				if("sex".equals(property.getNodeName())) {
					stu.setSex(property.getTextContent());
				}
				if("score".equals(property.getNodeName())) {
					stu.setSocre(Integer.parseInt(property.getTextContent()));
				}
				if("name".equals(property.getNodeName())) {
					stu.setName((property.getTextContent()));
				}				
			}
			//获取节点的子节点,返回子节点的集合。
			NodeList childNodes = it.getChildNodes();
			//遍历子节点,如果与该节点名称与Student的属性相对应,则在stu中存入对应的值
			for(int k=0;k<childNodes.getLength();k++) {
				Node item = childNodes.item(k);
				if("id".equals(item.getNodeName())) {
					stu.setId(Integer.parseInt(item.getTextContent()));
				}
				if("sex".equals(item.getNodeName())) {
					stu.setSex(item.getTextContent());
				}
				if("score".equals(item.getNodeName())) {
					stu.setSocre(Integer.parseInt(item.getTextContent()));
				}
				if("name".equals(item.getNodeName())) {
					stu.setName((item.getTextContent()));
				}
			}
			//向集合中添加该对象
			list.add(stu);
		}
		//遍历集合输出测试
		for(Students s:list) {
			System.out.println(s);
		}
	}	
}

运行结果

总结:

优点: ①易于使用

     丰富的API集合,可用于轻松地导航

     整棵树加载到内存,允许对XML文档进行随机访问

缺点:①整个XML文档必须一次解析完

     将整棵树加载到内存成本较高

     一般的DOM节点对于必须为所有节点创建对象的对象类型绑定不太理想

最适合于:需要修改XML文档的应用程序或XSLT应用程序(不可用于只读XML的应用程序)



猜你喜欢

转载自blog.csdn.net/m_target/article/details/80509293