xml的Dom解析
程序员文章站
2022-05-28 23:45:28
...
DOM 把 XML 文档视为一种树结构。通过这个 DOM 树,可以访问所有的元素。可以修改它们的内容(文本以及属性),而且可以创建新的元素。元素,以及它们的文本和属性,均被视为节点。
在这里介绍一下如何用java语言的dom来解析xml
这是需要解析的xml原文档
<?xml version="1.0" encoding="utf-8"?>
<!--加入DTD约束-->
<!DOCTYPE student SYSTEM "abc.dtd">
<student>
<stu no="1234" num="1111">
<name>张三丰</name>
<sex>男</sex>
</stu>
<stu no="2345">
<name>小龙女</name>
<sex>女</sex>
</stu>
</student>
这是相关联的dtd约束文件
<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT student (stu+)>
<!ELEMENT stu (name,sex,cla)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST stu
no CDATA #REQUIRED
num CDATA #IMPLIED
>
一、首先写一个Student类,包含其基本属性
package com.hb.dom;
/**
* Student节点
* @author HuangBin
* @2014年10月7日
*/
public class Student {
String name;
String sex;
int no;
int num;
}
二、开始解析
1、得到dom对象
在java中,我们要用到DocumentBuilderFactory类,用来产生dom解析器的工厂对象。
DocumentBuilder类,得到dom解析器
Document类,得到解析之后的dom对象
String path = "student.xml";
// 产生DOM解析器的工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 得到DOM解析器的对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析xml文件或者数据流,得到DOM对象
Document doc = builder.parse(path);
2、提取中间的元素
/**
* 递归解析xml的方法
*
* @param doc
*/
public static void getData(Node doc) {
NodeList list = doc.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
String name = node.getNodeName();
if (name.equals("stu")) {
stu = new Student();
DomParse.list.add(stu);
NamedNodeMap map = node.getAttributes();
for (int j = 0; j < map.getLength(); j++) {
Node nodeItem = map.item(j);
String attName = nodeItem.getNodeName();
String attVal = nodeItem.getNodeValue();
if (attName.equals("no")) {
stu.no = Integer.parseInt(attVal);
} else if (attName.equals("num")) {
stu.num = Integer.parseInt(attVal);
}
}
} else if (name.equals("name")) {
stu.name = node.getTextContent();
} else if (name.equals("sex")) {
stu.sex = node.getTextContent();
}
getData(node);
}
}
3、打印测试
for (Student stu : list) {
System.out.println(stu.name + " " + stu.sex + " " + stu.no + " "
+ stu.num);
}
运行结果为
张三丰 男 1234 1111
小龙女 女 2345 0
三、xml中新增元素
1、修改原有元素子元素
NodeList nodeList = doc.getElementsByTagName("name");
Node n = nodeList.item(1);
Text text = doc.createTextNode("哦哈哈");
n.appendChild(text);
2、修改原有元素属性
NodeList nodeList2 = doc.getElementsByTagName("stu");
Node n2 = nodeList2.item(1);
Attr att = doc.createAttribute("num");
att.setValue("123123");
Element element = (Element) n2;
element.setAttributeNode(att);
3、增加元素
// 得到节点
Node n3 = doc.getLastChild();
// 创建元素
Element e1 = doc.createElement("stu");
// 增加属性
Attr atr = doc.createAttribute("no");
atr.setValue("12343");
e1.setAttributeNode(atr);
// 增加属性
Attr atrr = doc.createAttribute("num");
atrr.setValue("111");
e1.setAttributeNode(atrr);
// 增加子元素
Element ele1 = doc.createElement("name");
ele1.setTextContent("新人");
e1.appendChild(ele1);
// 增加子元素
Element ele2 = doc.createElement("sex");
ele2.setTextContent("男");
e1.appendChild(ele2);
// 将元素加到节点
n3.appendChild(e1);
4、保存到文件中
// 创建一个用来转换DOM对象的转换器工厂对象
TransformerFactory tff = TransformerFactory.newInstance();
// 获得转换器对象
Transformer tf = tff.newTransformer();
// 定义要转换的源对象
DOMSource xml = new DOMSource(doc);
// 定义转换的目标文件
StreamResult result = new StreamResult(new File("student2.xml"));
// 开始转换
tf.transform(xml, result);
5、将新的xml解析并打印测试
// 获得doc中的数据
getData(doc);
// 遍历打印
for (Student stu : list) {
System.out.println(stu.name + " " + stu.sex + " " + stu.no + " "
+ stu.num);
}
运行结果为:
张三丰 男 1234 1111
小龙女哦哈哈 女 2345 123123
新人 男 12343 111
文件:
下一篇: XML的解析 DOM解析