遍历XML 分享修改删除

这两天光折腾xml的操作了。因为xml已知,所以觉得多套几个for就完了,可昨天晚上脑袋被套住出不来了。有时候实在没思路的时候,睡觉或许是个比较好的选择,今天一下茅塞顿开,还是写了个迭代,虽然现在仍然不能领会迭代的精髓,但还是想先和大家分享成果。代码如下:

依然用的是dom4j

 

 

XmlTree.java

 

package com.dianzi.test;

import java.io.*;
import java.util.*;

import org.dom4j.*;
import org.dom4j.io.*;

public class XmlTree {

 /**
  * @param args
  */
 public static void main(String[] args) {
  File file = new File("./src/com/dianzi/test/Log-Sample01.xml");

  SAXReader saxReader = new SAXReader();
  saxReader.setValidation(false);// 不验证xml文件内的dtd

  try {
   Document doc = saxReader.read(file);
   System.out.println(doc);
   XmlTree xml = new XmlTree();
   xml.printXMLTree(doc);

  } catch (Exception e) {
   e.printStackTrace();
  }

 }

 public void printXMLTree(Document doc) {
  Element root = doc.getRootElement();
  List arr = new ArrayList();
  List result = printElement(root, 1, arr);// 根节点深度为1

  return;
 }

 /**
  * 遍历标签元素的迭代方法
  *
  * @param element
  *            标签元素
  * @param level
  *            元素深度
  * @param resultList
  *            遍历的结果
  * @return 返回resultList
  */
 @SuppressWarnings("unchecked")
 private List printElement(Element element, Integer level, List resultList) {

  /**
   * 每一个tempList包含四个元素
   *
   * @get(0):记录元素名称,即打印<A>B</A>的A
   * @get(1):打印该标签的值,即打印<A>B</A>的B
   * @get(2):元素深度
   * @get(3):元素的属性及对应值列表,即<A c=“d” >B</A>=》attrObjList.get(0)存c
   *                       =》attrObjList.get(1)存d
   */
  List tempList = new ArrayList(4);
  tempList.add(element.getQualifiedName());// 记录元素名称,即打印<A>B</A>的A
  tempList.add(element.getText());// 打印该标签的值,即打印<A>B</A>的B
  // 打印标签值不能放在下面的if中,可能第二层就有值,如<root><A>B</A></root>
  tempList.add(level);// 元素深度;

  Iterator eleAttriItor = element.attributeIterator();
  if (eleAttriItor.hasNext()) {// 元素有参数的,遍历参数的个数
   List attrObjList = new ArrayList(element.attributes().size());
   while (eleAttriItor.hasNext()) {
    Attribute eleAttr = (Attribute) eleAttriItor.next();

    List attrObj = new ArrayList(2);
    attrObj.add(eleAttr.getName());
    attrObj.add(eleAttr.getValue());
    attrObjList.add(attrObj);
   }
   tempList.add(attrObjList);
  } else {
   // 没参数的
  }
  resultList.add(tempList);

  // 迭代
  for (Iterator iter = element.elementIterator(); iter.hasNext();) {
   Element sub = (Element) iter.next();
   printElement(sub, level+1, resultList);//深度加一
  }
  return resultList;
 }

}
 

 

 

Log-Sample01.xml

 

<?xml version="1.0" encoding="gb2312"?>
<students>
    <student age="25"  leader="学院领导"><!--如果没有age属性,默认的为20-->
     男,1982年生,硕士,现就读于北京邮电大学
    </student>
    <student>
        <name>cwb</name>
        <college leader="学院领导">PC学院</college><!--如果没有leader属性,默认的为leader-->
        <telephone>62358888</telephone>
        <notes>男,1987年生,硕士,现就读于中国农业大学</notes>
    </student>
    <student age="45">
        <name>xxxxx</name>
        <college leader="">xxx学院</college>
        <telephone>66666666</telephone>
        <notes>注视中,注释中</notes>
    </student>
    <student age="">
        <name>lxx</name>
        <college>yyyy学院</college>
        <telephone>88888888</telephone>
        <notes>注视中111,注释中222</notes>
    </student>
</students>
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值