用dom4j解析xml文件怎样将数据保存到list集合里

mhshran5408 2012-06-07 10:00:23
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<orgs>
<org>
<!-- 所有的员工 -->
<USERS>
<USER>
<USER_ID>HZ8a807837157e6c013716abed6302bd</USER_ID>
<LOGIN_NAME>ly</LOGIN_NAME>
<FIRSTNAME>梁</FIRSTNAME>
<GIVENNAME>莹</GIVENNAME>
<CERTIFICATE>password</CERTIFICATE>
<EMP_NUM>003</EMP_NUM>
</USER>
</USERS>
<!-- 所有的部门 -->
<DEPTS>
<DEPT>
<DEPT_ID>HZ8a807837157e6c013716a1ebcd023e</DEPT_ID>
<DEPT_NAME>秘书处</DEPT_NAME>
<DEPT_CODE>003</DEPT_CODE>
<PARENT_ID>HZ8a80783725fa2d01372bd37f83156a</PARENT_ID>
</DEPT>
</DEPTS>
</org>
</orgs>
...全文
872 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhshran5408 2012-06-07
  • 打赏
  • 举报
回复
public class Dom4jExample {
public void domForJXml() throws DocumentException, URISyntaxException{
URL urlfile = Dom4jExample.class.getResource("/ssynctmp5/processZzjg.xml");
File xml = new File(urlfile.toURI());
SAXReader saxReader = new SAXReader();
Document document = null;
try {
document = saxReader.read(xml);
} catch (MalformedURLException e) {
e.printStackTrace();
}
Element root = document.getRootElement(); // config获取到根节点orgs
Iterator iter = root.elementIterator();
Element childEle = null;
while (iter.hasNext()) {
childEle = (Element) iter.next(); //根据xml格式规定orgs下面只有一个孩子节点org
}
if (childEle != null) {
getElementChild(childEle);
}
}
public void getElementChild(Element ele){
Iterator orgChildIter = ele.elementIterator();
Element orgChildEle = null;
while (orgChildIter.hasNext()) {
orgChildEle = (Element)orgChildIter.next();
System.out.println(orgChildEle.getNodeTypeName()+"------"+orgChildEle.getName()+"----"+orgChildEle.getText().trim());
if(orgChildEle.getName().equals("USER")){
insterUserByXml(orgChildEle);
}else if(orgChildEle.getName().equals("DEPT")){
insterDeptByXml(orgChildEle);
}
getElementChild(orgChildEle);

}
}
public void insterUserByXml(Element ele){
List<String> listUser = new ArrayList<String>();
Attribute AttrId = ele.attribute("USER_ID");
String USER_ID = AttrId.getValue();
Attribute AttrLoginName = ele.attribute("LOGIN_NAME");
String LOGIN_NAME = AttrLoginName.getValue();
Attribute AttrFIRSTNAME = ele.attribute("FIRSTNAME");
String FIRSTNAME = AttrFIRSTNAME.getValue();
Attribute AttrGIVENNAME = ele.attribute("GIVENNAME");
String GIVENNAME = AttrGIVENNAME.getValue();
Attribute AttrCERTIFICATE = ele.attribute("CERTIFICATE");
String CERTIFICATE = AttrCERTIFICATE.getValue();
Attribute AttrEMP_NUM = ele.attribute("EMP_NUM");
String EMP_NUM = AttrEMP_NUM.getValue();
listUser.add(USER_ID);
listUser.add(LOGIN_NAME);
listUser.add(FIRSTNAME);
listUser.add(GIVENNAME);
listUser.add(CERTIFICATE);
listUser.add(EMP_NUM);

String sql = "INSERT INTO TO_HORIZON_USER(USER_ID,LOGIN_NAME,FIRSTNAME,GIVENNAME,CERTIFICATE,EMP_NUM) VALUES("+USER_ID+","+LOGIN_NAME+","+FIRSTNAME+","+GIVENNAME+","+CERTIFICATE+","+EMP_NUM+") where (select count(*) from TO_HORIZON_USER where USER_ID="+USER_ID+") <= 0";
Access.getMultiList(sql,listUser);
}


我是这样写的 但是能不能不要再迭代那块就开始去判断啊?急 帮帮忙! 谢谢
sffx123 2012-06-07
  • 打赏
  • 举报
回复

public static void main(String args[]) {
readXmlFile("etc/accoumt.xml");
}
public static void readXmlFile(String fileName) {
Element element = null;
File f = new File(fileName);
DocumentBuilder db = null; // documentBuilder为抽象不能直接实例化(将XML文件转换为DOM文件)
DocumentBuilderFactory dbf = null;
try {
dbf = DocumentBuilderFactory.newInstance(); // 返回documentBuilderFactory对象
db = dbf.newDocumentBuilder();// 返回db对象用documentBuilderFatory对象获得返回documentBuildr对象
Document dt = db.parse(f); // 得到一个DOM并返回给document对象
element = dt.getDocumentElement();// 得到一个elment根元素
System.out.println("根元素:" + element.getNodeName()); // 获得根节点
NodeList childNodes = element.getChildNodes(); // 获得根元素下的子节点
for (int i = 0; i < childNodes.getLength(); i++) // 遍历这些子节点
{
Node node1 = childNodes.item(i); // childNodes.item(i);
// 获得每个对应位置i的结点
if ("Account".equals(node1.getNodeName())) {
// 如果节点的名称为"Account",则输出Account元素属性type
System.out.println("\r\n找到一个账号. 所属区域:s"+ node1.getAttributes().getNamedItem("type").getNodeValue() + "$$");
NodeList nodeDetail = node1.getChildNodes(); // 获得<Accounts>下的节点
for (int j = 0; j < nodeDetail.getLength(); j++) { // 遍历<Accounts>下的节点
Node detail = nodeDetail.item(j); // 获得<Accounts>元素每一个节点
if ("code".equals(detail.getNodeName())) // 输出code
System.out.println("卡号: " + detail.getTextContent());
else if ("pass".equals(detail.getNodeName())) // 输出pass
System.out.println("密码: " + detail.getTextContent());
else if ("name".equals(detail.getNodeName())) // 输出name
System.out.println("姓名: " + detail.getTextContent());
else if ("money".equals(detail.getNodeName())) // 输出money
System.out.println("余额: " + detail.getTextContent());
}
}
}
} catch (Exception e) {
System.out.println(e);
}
}


<?xml version="1.0" encoding="gbk"?>
<Accounts>
<Account type="by0003">
<code>100001</code>
<pass>123</pass>
<name>李四</name>
<money>1000000.00</money>
</Account>
<Account type="hz0001">
<code>100002</code>
<pass>123</pass>
<name>张三</name>
<money>1000.00</money>
</Account>
</Accounts>
楼主改一下就可这是某位大侠分享的代码,如何加到list就不用说了吧,
brightyq 2012-06-07
  • 打赏
  • 举报
回复
针对某个Element,有elements()方法,返回List<Element>获得该结点下所有子结点。
然后循环这个List,每个子结点调用getText()依次add进你的List集合。
jbq333 2012-06-07
  • 打赏
  • 举报
回复
/**
* 反射设置实体不同类型字段的值 <暂时只支持 日期 字符串 boolean Integer值设置 待扩建>
*
* @param field
* @param obj
* @param value
* @throws Exception
*/
public static void convertValue(Field field, Object obj, String value)
throws Exception {
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (field.getGenericType().toString().equals("class java.lang.Integer")) {
field.set(obj, Integer.parseInt(value));
} else if (field.getGenericType().toString().equals("boolean")) {
field.set(obj, Boolean.parseBoolean(value));
} else if (field.getGenericType().toString().equals(
"class java.util.Date")) {
field.set(obj, sim.parse(value));
} else {
field.set(obj, value);
}

}
落下了一段代码没贴
jbq333 2012-06-07
  • 打赏
  • 举报
回复
/**
* 解析xml文件返回保存cls的List集合,如果返回码resultCode=1时则返回List为null
*
* @param xml
* @param cls
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static List<?> parseXml2List(String xml, Class<?> cls)
throws Exception {
List<Object> lists = null;
Document doc = DocumentHelper.parseText(xml);
Element et = doc.getRootElement();
String root = et.getName();
// 查看返回码是否为真.
List<Element> list = doc.selectNodes("//" + root + "/resultCode");
if (!list.isEmpty() && list.size() > 0) {
Element element = list.get(0);
String returnResult = element.getText();
if (returnResult.equals("0")) {
List<Element> father = doc.selectNodes("//" + root + "/"+ cls.getSimpleName()+"s");
//判断对象父节点是否有包含数据
if(father!=null&&!father.isEmpty()&&father.size()==1){
List<Element> userLists = father.get(0).elements();
if (userLists!=null&&!list.isEmpty()) {
lists = new ArrayList<Object>();
for (Element e : userLists) {
List<Element> li = e.elements();
Class<?> cl = (Class<?>) Class.forName(cls.getName());
Object ob = cl.newInstance();
for (Element element2 : li) {
String name = element2.getName();
String value = element2.getText();
Field field = ob.getClass().getDeclaredField(name);
field.setAccessible(true);
convertValue(field, ob, value);
}
lists.add(ob);
}
}
}
}

}
return lists;
}
详细代码去我百度空间
http://hi.baidu.com/jbq333/blog/item/b3e7fc1332512b20203f2e7f.html

50,543

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧