今天温习了一下DOM解析,记录关键点,以次加强记忆和理解
1 DOM 把XML 文件映射成一个倒挂的“”“树”,以根元素为根节点,每个节点都是一个对象,通过这些对象获取信息,
具体解析步骤如下:
1 创建解析器工厂
2由工厂创建解析器
3得到Document 对象,即Dom树
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("src/aa.xml");
//根据标签名获得所有该标签名字的点列表
NodeList studentList = doc.getElementByTagName("student");
//遍历这个studentList
for(int i = 0;i<studentList.length;i++){
Node studentNode= studentList.item(i);
Element studentEle = (Element)studentNode;
//获取student的属性
String studentName = studentEle.getAttribute("name");
//还可以获得这个当前的节点下的子节点
NodeList list = studentNode.getChildNodes();
//然后再继续遍历.......
}
//增加元素即标签student
Element newNode = doc.createNode("student");
//设置新创建的属性值
newNode.setAttribute("name","tom");
//再创建对应的元素即标签是type
Element newType = doc.createNode("type");
type.setAttribute("source","90");
//对应的type节点添加到student标签下
newNode.appendChild(newType);
//school为根标签
doc.getElementByTagName("school").item(0).appendChild(newStudent);
//保存XML
TransformerFacotory tf = TransformerFactory.newInstance();
Transformet transformer = tf.newTransformer();
transformer.setOutpurProperty(OutputKeys.Encoding,"utf-8");
DOMSource docsource = new DOMSource(doc);
StreamResult streamResult = new StreamResult(new File("src/aa.xml"));
transformer.transform(docsource,streamResult);
*****************************************华丽的分割线*******************************************
2下面是Dom4J
只需要两步就可以加载xml
SAXReader saxReader = new SAXReader();
Document doc = saxReader.reader(new File("src/aa.xml"));
Element root = doc.getRootElement();
//将根节点的子一代遍历出
for(Iterator ite = root.elementIterator();ite.hasNext()){
Element student = (Element)ite.next();
//获得这个节点的属性name
Attribute nameattr = student.attribute("name");
String name = namesttr.getValue();
}
下面写几个常用的方法
//得到某个对应名字的节点
Element memberEle = root.element("member");//member 是节点的名字
//对应文本的内容
String text = memberEle.getText();
//或者直接去对应元素的文本内容 ,例如根元素下的name子节点的文本内容
String test = root.elementText("name");
//遍历指定名字的节点下的所有子节点并进行遍历,例如取student的节点下子节点进行遍历
List nodes = rootEle.elements("student");
for(Iteator it = nodes.iterator;it.hasNext()){
Element ele = (Element)it.next();
........
}
//遍历某个节点的所有子节点
for(Iterator it = root.elementIterator();it.hasNext();){
Element ele = it.next();
.......
}
//某个节点下添加子节点
.addElement(nodeNma);
parentElm.remove(childNode)//parentElm是父节点,
//获得某节点的属性
Attribute attribute = root.attribute("age") //属性名
String text = attribute.getText();//取得属性文本值
//取得指定名字节点的指定属性
root.element("name").attributValue("age");
//遍历某个节点的属性
for(Iterator it = root.attributeIterator();it.hasNext();){
Attribute attr = (Attribute)it.next()
String text = sttr.getText();
//设置某个节点的属性
.addAttribute("name","tom");
//设置属性文本值
Attribute attr = root.attribute("name");
attr.setText("tom");
//删除
root.remove(attr)
}