日期:2014-05-20  浏览次数:20727 次

关于使用jdom得到xml文件的结构树!!
由于没有xml的DTD需要分析xml的结构
不知道使用jdom怎么样得到xml的结构树了
不知道各位GGJJ有没有示例程序能借鉴一下,小弟感激不尽

------解决方案--------------------
package com.icbridge.mx.util;

import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
import org.apache.log4j.Logger;
import com.icbridge.mx.dbc.OracleDBC;

public class XmlWriter {

private static Logger logger = Logger.getLogger(XmlWriter.class);

public XmlWriter(){

}
/**
*
* @Author: Gary.M
* @Date: 2007-04-11 上午09:44:24
* @param sql
* @param parentElement 父级Element名
* @param childElement 子Element名
* @param fileName 最终生成的(xml)文件名(包括路径)如: "d:\\data.xml "
* @return
*/
public boolean isCreate(String sql,String parentElement,String childElement,String fileName){

boolean isDone = true;
OracleDBC dbc = null;
Connection con = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
ResultSetMetaData rsmd = null;
int numberOfColumns = 0;
Document document=new Document(new Element(parentElement));//创建文档

try
{
dbc = new OracleDBC();
con = dbc.getConnection();
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
rsmd = rs.getMetaData(); //获取字段名
numberOfColumns = rsmd.getColumnCount(); //获取字段数

if(rs == null)
{
logger.info( "无法取得记录集! ");
isDone = false;
}
else
{
int i=0;
while(rs.next())//将查询结果取出
{
Element element0=new Element(childElement); //创建元素 生成JDOM树
document.getRootElement().addContent(element0);
for(i=1; i <=numberOfColumns;i++)
{
String date = rs.getString(i);
//new String(rs.getString(i).getBytes( "ISO-8859-1 "), "gb2312 "); //代码转换
Element element = new Element(rsmd.getColumnName(i)).setText(date);
element0.addContent(element);
}
}
}
rs.close();
pstmt.close();

}catch(Exception e)
{
logger.error( "数据库操作失败! "+e);
}
finally
{
dbc.close();
}
XMLOutputter outp = new XMLOutputter();

try
{
outp.output(document, new FileOutputStream(fileName)); //输出XML文档
}
catch(IOException e)
{
logger.error( "XML 文档生成失败! "+e);
}
logger.info( "XML 文档生成完毕! ");

return isDone;
}

}

------解决方案--------------------
dtd只是规范xml文档,dom在没有dtd的时候照样可以按照他自己的方式解析文档
------解决方案--------------------
Java code

package run;
import org.jdom.*;
import org.jdom.input.*;
import java.io.*;
import java.util.*;;
public class jdomTest {
     public void jdomtest() {
            String textXml = null;
            textXml = "<note width="+"\"100%\""+">";
            textXml = textXml +
                "<to><to1>a111</to1><to2>a222</to2><to3>a333</to3></to><from>bbb</from><heading>ccc</heading><body>ddd</body>";
            textXml = textXml + "</note>";
            System.out.println(textXml);
            SAXBuilder builder = new SAXBuilder();
            Document doc = null;
            Reader in= new StringReader(textXml);
            try {
              doc = builder.build(in);
              
              Element root = doc.getRootElement();
              System.out.println(root.getAttributeValue("width"));
              List ls = root.getChildren();//注意此处取出的是root节点下面的一层的Element集合
              for (Iterator iter = ls.iterator(); iter.hasNext(); ) {
                 Element el = (Element) iter.next();
                 if(el.getName().equalsIgnoreCase("to")){
                     List ls2 = el.getChildren();
                     for(Iterator iter2 = ls2.iterator(); iter2.hasNext();){                         
                         Element e2 = (Element)iter2.next();
                         if(e2.getTextTrim().equals("to1")){
                             e2.setText("I have bean changed in this element.");
                             System.out.println(e2.getName());
                             continue;
                         }
                         System.out.println(e2.getName());
                     }
                     continue;
                 }
                 System.out.println(el.getText());
                
              }
            }
            catch (IOException ex) {
              ex.printStackTrace();
            }
            catch (JDOMException ex) {
              ex.printStackTrace();
            }
          }

}