呵呵,我的写法和你不一样,代码如下,使用很正常的
配置文件如下:
<?xml version="1.0" encoding="GB2312"?>
<config>
  <weburl>http://172.16.2.118/gstest.asp</weburl>
  <jodbc>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=GSTEST</jodbc>  
  <uid>sa</uid> 
  <pwd />
</config>部分代码
package voicexml;
import java.util.*;
import java.text.*;
import java.net.*;
import javax.swing.*;
import java.io.*;
import java.net.HttpURLConnection;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.XmlDocument;
import org.xml.sax.*;
import org.w3c.dom.Text;
//*********************读取配置文件**********************
 public String GetWebURL(JTextArea weburl,JTextArea jdbc,JTextArea sa,JPasswordField pwd)
 {
   DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
   DocumentBuilder db=null;
  try {
    db = dbf.newDocumentBuilder();
  }
  catch (ParserConfigurationException ex) {JOptionPane.showMessageDialog(null,"获取WEBURL地址失败,请检测文件是否存在");
    return "";
  }
  Document doc=null;
  try {
//linux下的当前路径,windows下可以改成 doc = db.parse("config.xml");
    doc = db.parse("./config.xml");  }
  catch (IOException ex1) {JOptionPane.showMessageDialog(null,"获取WEBURL地址失败,请检测文件是否存在");
    return "";
  }
  catch (SAXException ex1) {
  }
  String textvalue="";
  Element root=doc.getDocumentElement();
  NodeList nodelist=root.getElementsByTagName("weburl");
  Element e=(Element)nodelist.item(0);  Text t=(Text) e.getFirstChild();
  if(t!=null)
    textvalue=t.getNodeValue().trim();
  if(weburl!=null)
    weburl.setText(textvalue);
  NodeList nodelist1=root.getElementsByTagName("jodbc");
  Element e1=(Element)nodelist1.item(0);
  Text t1=(Text) e1.getFirstChild();
  if(t1!=null && jdbc!=null)
  jdbc.setText(t1.getNodeValue().trim());  NodeList nodelist2=root.getElementsByTagName("uid");
  Element e2=(Element)nodelist2.item(0);
  Text t2=(Text) e2.getFirstChild();
  if(t2!=null && sa!=null)
    sa.setText(t2.getNodeValue().trim());  NodeList nodelist3=root.getElementsByTagName("pwd");
  Element e3=(Element)nodelist3.item(0);
  Text t3=(Text) e3.getFirstChild();
  if(t3!=null && pwd!=null)
     pwd.setText(t3.getNodeValue().trim());  //String textvalue=t.getNodeValue();
  return textvalue; }象你的那个配置文件只要在这里Element e=(Element)nodelist.item(0);做个循环不用item(0)就行了

解决方案 »

  1.   

    嘿嘿  先谢谢了 这为老兄的代码太长 我都搞糊涂了  请看我新写的代码xml:<?xml version="1.0" encoding="UTF-8"?>
    <total>
    <wep-add >com.mysql.jdbc.Driver</wep-add>
    <wep-app >jdbc:mysql://localhost/USER</wep-app>
    </total>jdom类:
    package com.logitic.utils;
    import java.io.*;
    import org.jdom.*;
    import java.util.*;
    import org.jdom.input.*;
    import org.jdom.output.*;
    public class XMLOutputter
    {
      String l_s_driver = null;
      String l_s_url = null;  public String soft(String driver)
      {    try{
                this.l_s_driver = driver;
                SAXBuilder builder = new SAXBuilder();
                Document doc = builder.build(new FileInputStream("driver.xml"));
                Element root = doc.getRootElement();
                Element wepOne = root.getChild("wep-add");
                driver = wepOne.getText();
           }
         catch(FileNotFoundException e)
         {
               e.toString();
         }
         catch(JDOMException e)
         {
               e.toString();
         }catch(NullPointerException e)
         {
           e.printStackTrace();
         }
         return l_s_driver;
       }   public String nost(String url)
       {        try{
                    this.l_s_url = url;
                    SAXBuilder builder = new SAXBuilder();
                    Document doc = builder.build(new FileInputStream("driver.xml"));
                    Element root = doc.getRootElement();
                    Element wepTwo = root.getChild("wep-app");
                    url = wepTwo.getText();
               }
            catch(FileNotFoundException e)
            {
               e.toString();
            }
            catch(JDOMException e)
            {
               e.toString();
            }
            catch(NullPointerException e)
            {
              e.printStackTrace();
            }
            return l_s_url;
        }}这个类把两个变量driver和url 传递给ConnectionPool类ConnectionPool类:package com.business.databean;
    import java.sql.*;
    import com.logitic.utils.*;
    public class ConnectionPool {
      private Connection conn = null;
      private Statement stmt = null;
      private ResultSet rs = null;
      private String l_s_driver;
      private String l_s_url;
      public Connection Pool(String driver,String url){        this.l_s_driver=driver;
            this.l_s_url=url;        try
            {
                  XMLOutputter xml = new XMLOutputter();
                  driver = xml.soft(driver);
                  url = xml.nost(url);
                  Class.forName(driver);
                  conn = DriverManager.getConnection(url);
                  stmt = conn.createStatement();
            }
            catch (SQLException e)
            {
              e.toString();
            }
            catch (ClassNotFoundException e)
            {
              e.toString();
            }
            catch(NullPointerException e)
            {
              e.printStackTrace();
            }
            return conn;
        }
    }程序编译没有问题 可是执行起来总出现NullPointerException
    是因为什么问题呢  拜托了
      

  2.   

    因为你上面用的有些包在我这里是用不了的,编译都过不了,所以不能给你调试,
    根据NullPointerException提示
    指的是一个空的对象异常,触发这种错误通常是没有初始化或者初始化失败,比如象参数错误的情况导致对象初始化失败,你用debug模式调试下找出问题应该很容易的
      

  3.   

    我的XML文件和ConnectionPool类应该没什么问题 主要是JDOM那个类出了点错误
    我不清楚我XMLOutputter类里访问XML的时候有没有写错误 异常是这样的
    java.lang.NullPointerException at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:140) at com.business.databean.ConnectionPool.Pool(ConnectionPool.java:21) at com.business.databean.Databean.limit(Databean.java:26) at com.business.user.ConcreteLandUser.login(ConcreteLandUser.java:14) at com.border.action.LoginAction.perform(LoginAction.java:39) at org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1787) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1586) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:510) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027) at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125) at java.lang.Thread.run(Thread.java:536)StandardWrapperValve[action]: Servlet.service() for servlet action threw exceptionjava.lang.NullPointerExceptionjava.lang.NullPointerException at com.business.databean.Databean.limit(Databean.java:27) at com.business.user.ConcreteLandUser.login(ConcreteLandUser.java:14) at com.border.action.LoginAction.perform(LoginAction.java:39) at org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1787) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1586) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:510) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027) at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125) at java.lang.Thread.run(Thread.java:536)你有邮箱吗?  我把我这个模块给你发过去你看看吧  我的是 [email protected]
    另外DEBUG模式怎么弄啊  请指教
      

  4.   

    马上给你过去哈   弄了好久还是那个异常     ConnectionPool类里我直接加MYSQL驱动
    和数据库名的话程序就可以执行成功  但是用XML,JDOM就出了这个异常
      

  5.   

    已经收到你的文件,还是无法编译,可能有些libary找不到吧,所以也没怎么看你的代码
    还是拿你上面贴的哪个XMLOutputter类来做说明吧,你可以改成如下的形式
    import java.io.*;
    import org.w3c.dom.*;
    import java.util.*;
    import javax.xml.parsers.*;
    import org.w3c.dom.*;
    import org.apache.crimson.tree.XmlDocument;
    import org.xml.sax.*;
    import org.w3c.dom.Text;public class XMLOutputter
    {  public String driver="";
      public String url="";
      public String soft(String driver)
      {
                DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
                DocumentBuilder builder=null;
               try {
                 builder = dbf.newDocumentBuilder();
               }
               catch (ParserConfigurationException ex)
               {
               }
                //DocumentBuilderFactory builder = new SAXBuilder();
                Document doc = null;
                try {
                  doc = builder.parse("totall.xml");
                }
                catch (IOException ex1)
                {
                }
                catch (SAXException ex1)
                {
                }
                Element root = doc.getDocumentElement();
                Element wepOne = (Element)root.getElementsByTagName("driver").item(0);
                driver=wepOne.getAttribute("name");
                Element urllink = (Element)root.getElementsByTagName("url").item(0);
                url=urllink.getAttribute("name");
       }}我觉得你完全没有必要用两个函数分别取参数所以将note函数去掉了这样你
    只需
        XMLOutputter obj=new XMLOutputter();
        obj.soft("");
        然后把obj.driver
            obj.url值拿出来就ok了(driver和url最好按属性的方式写,我这里简单的写不太合规范)   
      

  6.   

    至于你soft为什么要传一个参数,我不太明白的用意,所以没改
      

  7.   

    要是我在soft里传递2个参数,那我在另一个类里怎么调用着两个参数呢
    driver和url最好按属性的方式写的话具体点是什么样式的 请举个例子告诉我吧  谢谢哈
      

  8.   

    private strDriver="";
     public void setDriver(String s)
     {
       strDriver=s;
     }
     public String getDriver()
     {
       return strDriver;
     }
    通常的组件编写都采用这种方式,比较灵活
    soft里传递多个参数在另一个类里调用,这通常是指针或引用的做法,java不支持指针,可能要传引用类型的数据才行,我还没这样试过,不知道是否可行,因为那样做反倒要做数据类型转换麻烦
      

  9.   

    你给我发的程序还是无法跟读取XML的驱动名和数据库名
    我刚才试着在struts-config.xml加标签这个标签里面是驱动名跟数据库名,原先的XML文件不用
    如下:
      <data-sources>
         <data-source>
             <set-property property="driver" value="com.mysql.jdbc.Driver" />
             <set-property property="url" value="jdbc:mysql://localhost/USER" />
         </data-source>
      </data-sources>在struys-config.xml加入了这个标签  可是程序编译的时候不能编译过去
    出现了servlet异常这是为什么呢  难道我网里面加入标签还要改别的吗??
      

  10.   

    没道理呀,我试过了取出来正常啊,你设置下断点用debug project跟踪下就知道取出来的值是否正确了,老不跟踪代码,出了问题也不知道问题到底在哪个环节啊
      

  11.   

    你使用能取出来啊   就是用的我那个XML文件吗?   设置断点和踪代码怎么弄啊  详细一点哈 谢谢
      

  12.   

    当然可以    
        XMLOutputter obj=new XMLOutputter();
        obj.soft("");    System.out.print(obj.driver+"\n"+obj.url);
    显示的结果是:
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost/USER
    另外
    public String soft(String driver)的参数不要用driver因为已经有个public String driver="";
    光标移到你要设置断点的行按F5就可以了,运行工程时选择debug project就会进入断点了
      

  13.   

    顺便提醒下,你的xml文件如果没有加路径的话
    如doc = builder.parse("totall.xml");那么totall.xml是要放在和.jpx工程文件同目录的哦
      

  14.   

    好的   顺便问问 xml怎么路径啊   我的就是找不到XML  我想给XML加路径  辛苦哈
      

  15.   

    你直接把xml放到工程下就可以了
      

  16.   

    比如说doc = builder.parse("./xml/totall.xml");
    就是表示当前工程文件目录下的xml文件下的totall.xml
      

  17.   

    pubol(Bob)哥们  把qq给我好不?
      

  18.   

    恩 我试着做了  我的问题就是 找不到XML文件  该放的地方我都放了XML文件  可就是找不到
    我用断点DEBUG模式下就是 doc = builder.parse("totall.xml");这里错了 就是找不到文件
    我试着doc = builder.parse("./xml/totall.xml");也是一样  我原来的程序里头是
    Document doc = builder.build(new FileInputStream("driver.xml"));这句错误 
    一执行到这里就抛NullPointerException  就是没找到文件  之后的语句更别说执行了
    能解决吗?   谢谢了
      

  19.   

    还有就是我打算在struts-config.xml里添加标签把驱动名和数据库名放在里面   <data-sources>
         <data-source>
             <set-property property="driver" value="com.mysql.jdbc.Driver" />
             <set-property property="url" value="jdbc:mysql://localhost/USER" />
         </data-source>
      </data-sources>添加这个标签  可是执行的时候出现了 servlet异常  往struts-config.xml里添加标签时
    还要改web.xml里的servlet标签吗?  改的话如何改呢  ?   非常期待 谢谢
      

  20.   

    呵呵,还没搞定啊,你重新建个工程,把那个类加进去试肯定可以的,如果你实在不能确定路径的话,你可以在你程序的某个地方加上
        FileOutputStream outFile = new FileOutputStream("test.txt");
        OutputStreamWriter outWriter=new OutputStreamWriter(outFile);
        outWriter.write("testA\r");
        outWriter.write("testB");
        outWriter.close();
        outFile.close();看生成的test.txt文件在什么地方,然后把xml文件放在哪个地方就行了
      

  21.   

    知道了  谢谢 我还有一个问题
    程序执行的时候出现了这个错误:PARSE error at line 2 column -1
    org.xml.sax.SAXParseException: 组件类型“totall”未被声明。这个totall.xml声明的话在哪儿声明  应该怎么声明呢   请指教
      

  22.   

    up   up    up     up      up