dom解析的基本思路:
1、将整个xml文件一次性读入内存
2、将整个xml看做一棵树
3、xml中的每一个标签,属性,文本都看做是树上的一个结点
4、然后可以对结点进行增删改查的操作
话不多说,上代码。
1、首先我在d:\abc中新建了一个文本文件,重命名为stus.xml,以下是文件中的内容
<?xml version = "1.0" encoding = "gbk" ?>
<stus class = "s160401a">
<stu num = "001" >
<name>张三</name>
<age>20</age>
<sex>男</sex>
</stu>
<stu num = "002">
<name>李四</name>
<age>21</age>
<sex>女</sex>
</stu>
<stu num = "003">
<name>王五</name>
<age>22</age>
<sex>男</sex>
</stu>
</stus>
在第一行是xml声明<?xml version="1.0" encoding="gbk" ?>,version表示版本号,encoding表示编码方式,微软的记事本用的是国标的编码方式,如果要用utf-8,则要在另存为窗口中修改编码方式为utf-8。
必须且只能有一对根标签,我写的根标签是<stus></stus>。其他的就不多说了。
2、这是一个学生类,定义了一些属性和get、set方法
<span style="font-size: 16px;">public class student {
public static string class;
private string name;
private int num;
private int age;
private char sex;
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
public int getnum() {
return num;
}
public void setnum(int num) {
this.num = num;
}
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public char getsex() {
return sex;
}
public void setsex(char sex) {
this.sex = sex;
}
}</span>
3、这是用dom解析的类,看这个类之前还要了解一下。
documentbuilderfactory dom解析器工厂
documentbuilder dom解析器
document 文档对象
node 结点【接口】
element 元素结点【标签结点】
attr 属性结点
text 文本结点
node 是document,element,attr,text的父接口
nodelist 结点列表
namednodemap 一个结点的所有属性
<span style="font-size: 16px;">import javax.xml.parsers.documentbuilder;
import javax.xml.parsers.documentbuilderfactory;
import org.w3c.dom.attr;
import org.w3c.dom.document;
import org.w3c.dom.element;
import org.w3c.dom.namednodemap;
import org.w3c.dom.node;
import org.w3c.dom.nodelist;
import bean.student;
public class domparser {
public static void main(string[] args) throws exception {
// 得到解析器工厂对象
documentbuilderfactory factory = documentbuilderfactory.newinstance();
// 生产一个解析器对象
documentbuilder builder = factory.newdocumentbuilder();
// 开始解析xml文件,得到解析的结果,是一个document对象
// document对象叫做文档树对象
document dom = builder.parse("d:\\abc\\stus.xml");
// 通过document对象提取数据
// document对象的第一个子节点是根节点[根标签]
node root = dom.getfirstchild();
// 获得标签的名字
string str = root.getnodename();
// 获得根节点的属性
namednodemap attrs = root.getattributes();
// 强转成attr类型 属性类
attr attr = (attr) attrs.getnameditem("class");
// 获得属性里的值
string v = attr.getvalue();
system.out.println(v);
// 获得所有的学生-------------------------------------
nodelist list = root.getchildnodes();
for (int i = 0; i < list.getlength(); i++) {
node node = list.item(i);
// 判断是否是标签结点
if (node instanceof element) {
element e = (element) node;
// 获得标签结点里属性的值
string num = e.getattribute("num");
system.out.println(num);
// 输出标签中的文本
// system.out.println(e.gettextcontent());
// 继续获得stu的子节点
nodelist nodelist = e.getchildnodes();
for (int j = 0; j < nodelist.getlength(); j++) {
node n = nodelist.item(j);
if (n instanceof element) {
element ele = (element) n;
// 获得元素结点的标签名字
string nodename = ele.getnodename();
// 获得元素结点标签中的文本
string value = ele.gettextcontent();
if (nodename.equals("name")) {
system.out.println("姓名:" + value);
} else if (nodename.equals("age")) {
system.out.println("年龄:" + value);
} else if (nodename.equals("sex")) {
system.out.println("性别:" + value);
}
}
}
}
}
}
}</span>
自己在其中总结了一些方法:
documentbuilderfactory类:
public static documentbuilderfactory newinstance(); //得到解析器工厂对象
public abstract documentbuilder newdocumentbuilder(); //生产一个解析器对象
documentbuilder类:
public document parse(string uri); //解析路径为uri的xml文件,得到解析的结果是一个document对象
node类:
public node getfirstchild(); //得到document对象的第一个子结点,也就是根结点、或者叫根标签,在上面的代码中得到的是stus,看上面的第1点中的xml文件的内容。
public namednodemap getattributes();//获得结点的属性
public nodelist getchildnodes();//获得所有子结点
public string getnodename();//获得标签的名字
public string gettextcontent() throws domexception;//获得标签结点中的文本
namednodemap类:
public node getnameditem(string name);//返回所有名字为name的结点
attr类:
public string getvalue();//获得属性里的值
nodelist类:
public node item(int index);//返回第index个结点
element类:
public string getattribute(string name);//获得标签结点里属性name的值
以上就是详解xml- jaxp技术-dom解析的详细内容。