24.用dom4j组件解析如下XML格式的文件:
<?xml version="1.0" encoding="UTF-8"?>
<generator>
<table name="login" operation="1">
  <column name="username" handle="0">aaa</column>
  <column name="password" handle="0">123</column>
</table>
<table name="login" operation="2">
  <column name="id" handle="1">1</column>
  <column name="username" handle="0">bbb</column>
  <column name="password" handle="0">444</column>
</table>
<table name="login" operation="3">
  <column name="id" handle="1">4</column>
</table>
</generator>
规则:<table>operation 1表insert,2表update,3表delete.
<column>handle 1表作为where条件,0表作为操作字段。
要求:按照规则生成三条SQL语句!(即做一个方法解析xml文件生成一个含有三条SQL语句的字符串)

package com.softeem.demo;

import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class TestXML {
  /**
    * 解析XML文件生成一个含有可执行SQL语句的字符串
    *
    * @paramxmlFileName
    * @returnSQL
    */

  public static String parseXmltoSQL(String xmlFileName) {
    StringBuffer sbsql = new StringBuffer();
    SAXReader reader = new SAXReader();
    try {
      Document document = (Document) reader.read(new File(xmlFileName));
//      Element element = document.getDocumentElement();
      Element element = document.getRootElement();
      Iterator it = element.elementIterator("table");
      while (it.hasNext()) {
        element = (Element) it.next();
        // 获得对表的操作
        String oper = element.attributeValue("operation");
        // 获得表名
        String tableName = element.attributeValue("name");
        if ("1".equals(oper)) {
          sbsql.append("insert into ").append(tableName);
          Iterator it2 = element.elementIterator("column");
          String columnName1 = null;
          String columnValue1 = null;
          String columnName2 = null;
          String columnValue2 = null;
          if (it2.hasNext()) {
            element = (Element) it2.next();
            columnName1 = element.attributeValue("name");
            columnValue1 = element.getText();
          }
          if (it2.hasNext()) {
            element = (Element) it2.next();
            columnName2 = element.attributeValue("name");
            columnValue2 = element.getText();
          }
          sbsql.append("(" + columnName1 + "," + columnName2 + ")"
              + " values('" + columnValue1 + "','" + columnValue2
              + "')\n");

        } else if ("2".equals(oper)) {
          sbsql.append("update ").append(tableName);
          Iterator it2 = element.elementIterator("column");
          String columnName1 = null;
          String columnValue1 = null;
          String columnName2 = null;
          String columnValue2 = null;
          String columnName3 = null;
          String columnValue3 = null;
          if (it2.hasNext()) {
            element = (Element) it2.next();
            columnName1 = element.attributeValue("name");
            columnValue1 = element.getText();
          }
          if (it2.hasNext()) {
            element = (Element) it2.next();
            columnName2 = element.attributeValue("name");
            columnValue2 = element.getText();
          }
          if (it2.hasNext()) {
            element = (Element) it2.next();
            columnName3 = element.attributeValue("name");
            columnValue3 = element.getText();
          }
          sbsql.append(" set " + columnName2 + "='" + columnValue2
              + "'," + columnName3 + "='" + columnValue3
              + "' where " + columnName1 + "=" + columnValue1
              + "\n");

        } else if ("3".equals(oper)) {
          sbsql.append("delete from ").append(tableName);
          Iterator it2 = element.elementIterator("column");
          String columnName1 = null;
          String columnValue1 = null;
          if (it2.hasNext()) {
            element = (Element) it2.next();
            columnName1 = element.attributeValue("name");
            columnValue1 = element.getText();
          }
          sbsql.append(" where " + columnName1 + "=" + columnValue1);

        }
      }
    } catch (DocumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return sbsql.toString();
  }
  public static void main(String[] args) {
    String str = "D://aa.xml";
    String result = null;
    try{
      result = parseXmltoSQL(str);
      System.out.println(result);
    }catch(Exception e){
    }
  }
}
输出结果:
insert into login(username,password) values('aaa','123')
update login set username='bbb',password='444' where id=1
delete from login where id=4

解析xml文件,我一看代码长就糊涂,以前看过好几遍就是记不住,自己写不出来,其实有什么啊 关键就那么四五句话,我今天把这个背过背牢,以后再也不能忘了,真是天天吃稀饭的命!!
SAXReader reader = new SAXReader(); //初始化一个SAXReader 对象
Document document = (Document) reader.read(new File(xmlFileName));
//通过指定文件路径 读取文件,生成一个 Document对象
Element element = document.getRootElement();//文档对象要获取根元素啊亲
Iterator it = element.elementIterator("table");//开始迭代了
下面就是不停的找元素啊,找属性啊,找文本值啊
element = (Element) it.next(); //迭代出元素了
String oper = element.attributeValue("operation"); //获得属性值了
columnValue2 = element.getText(); //获得文本了
想想 文档结构模型,一步一步来的,其他解析方式不也大同小异吗,学好一个,比都蜻蜓点水强,长点心。。。

<?xml version="1.0" encoding="UTF-8"?>
<generator>
<table name="login" operation="1">
  <column name="username" handle="0">aaa</column>
  <column name="password" handle="0">123</column>
</table>
------------------------------------------------------
Element element = document.getRootElement();//文档对象要获取根元素啊亲,这个根元素就是 generator,通过根元素迭代子元素
Iterator it = element.elementIterator("table");//开始迭代了


另外上面的程序只是处理元素不是很分散,如果元素类别较为分散,只掌握以上的几个方法是不够的,比如以下 xml文件
<?xml version="1.0" encoding="GBK"?>
<doc>
        <person id="1" sex="m">
                <name>zhangsan</name>
                <age>32</age>
                <adds>
                        <add code="home">home add</add>
                        <add code="com">com add</add>
                </adds>
        </person>
        <person id="2" sex="w">
                <name>lisi</name>
                <age>22</age>
                <adds>
                        <add ID="22" id="23" code="home">home add</add>
                        <add ID="23" id="22" code="com">com add</add>
                        <add id="24" code="com">com add</add>
                </adds>
        </person>
</doc>
person的子元素,类别较为分散,用下面的方法:
String name = e_pe.element("name").getText();//直接通过.element() 方法就可以根据 子元素的名字,找到子元素,只有在有两个以上的子元素相同时,进行迭代 比如<add >元素
String age = e_pe.element("age").getText();

String add = e_add.getTextTrim();//这个可以去掉空格
里面的方法有很多,用起来非常灵活,当然必须先了解,才能游刃有余,手中无刀,心中有刀,有空多学点吧。。

另外:加入 
jaxen-1.1-beta-6.jar 可以用 XPath 对XML文件进行操作,试想以前的操作必须遍历整个xml文档,如果xml文档较多,而我们要从xml中取的信息又相对较少时,上面那个方法太坑爹了, 用XPath可以方便的对xml文档中任意位置的数据进行拿出来,方便何止一千倍啊啊。。
方法:
System.out.println("---------通过XPath获取一个元素----------");
    Node node1 = document.selectSingleNode("/doc/person");
    System.out.println("输出节点:" + "\t" + node1.asXML());

    Node node2 = document.selectSingleNode("/doc/person/@sex");
    System.out.println("输出节点:" + "\t" + node2.asXML());

    Node node3 = document
        .selectSingleNode("/doc/person[name=\"zhangsan\"]/age");
    System.out.println("输出节点:" + "\t" + node3.asXML());

    System.out.println("\n---------XPath获取List节点测试------------");
    List list = document
        .selectNodes("/doc/person[name=\"zhangsan\"]/adds/add");
    for (Iterator it = list.iterator(); it.hasNext();) {
      Node nodex = (Node) it.next();
      System.out.println(nodex.asXML());
    }

    System.out.println("\n---------通过ID获取元素的测试----------");
    System.out.println("陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性!");
    String id22 = document.elementByID("22").asXML();
    String id23 = document.elementByID("23").asXML();
    String id24 = null;
    if (document.elementByID("24") != null) {
      id24 = document.elementByID("24").asXML();
    } else {
      id24 = "null";
    }
可以取得单个节点:
document.selectSingleNode(),括号里面是判断条件,通过条件的灵活变化,可以取得任意想得到的节点,确实很强大,所以有必要学学,条件的编写:
document.selectSingleNode() 取得节点,如果两个则取第一个
document.electNodes() 取得节点集合
document.elementByID() 通过ID取得,根据xml中的ID取,id则为属性
node.asXML() 输出内容
输出的都是xml格式的,要取得数据,还不清楚怎么操作

/doc/person -->取得person节点,
/doc/person/@sex -->取得属性,属性加@符号
/doc/person[name=\"zhangsan\"]/age -->取得节点 []内是判断吧,符合条件的
/doc/person[name=\"zhangsan\"]/adds/add--->取得集合
看结果吧:
---------通过XPath获取一个元素----------
输出节点: <person id="1" sex="m"> 
        <name>zhangsan</name> 
        <age>32</age> 
        <adds> 
            <add code="home">home add</add> 
            <add code="com">com add</add> 
        </adds> 
    </person>
输出节点: sex="m"
输出节点: <age>32</age>

---------XPath获取List节点测试------------
<add code="home">home add</add>
<add code="com">com add</add>

---------通过ID获取元素的测试----------
陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性!
id22=  <add ID="22" id="23" code="home">home add</add>
id23=  <add ID="23" id="22" code="com">com add</add>