2013-02-11 91 views
2

我想解析一个XML文件来设置我的数据库的连接。但是我只返回了空字符串。有人可以检查我做错了什么吗?Java:空值解析XML文件

Java类(DBCONFIG仅仅是一个的细节字符串类别)

public class XMLReader { 

public Dbconfig read(){ 

    Dbconfig conf = new Dbconfig(); 

    try { 
     File file = new File("database.xml"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(file); 
     doc.getDocumentElement().normalize(); 
     //System.out.println("Root element " + doc.getDocumentElement().getNodeName()); 
     NodeList nodeLst = doc.getElementsByTagName("database"); 


     Element element = (Element) nodeLst.item(0); 
     NodeList url = element.getElementsByTagName("url"); 
     conf.url = url.item(0).toString(); 
     NodeList driver = element.getElementsByTagName("driver"); 
     conf.driver = driver.item(0).toString(); 
     NodeList username = element.getElementsByTagName("username"); 
     conf.username = username.item(0).toString(); 
     NodeList password = element.getElementsByTagName("password"); 
     conf.password = password.item(0).toString(); 

     System.out.format("####Printing XML configuration:%s %s %s %s \n",conf.url, conf.driver, conf.username, conf.password); 


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

XML文件(它应该只提供1个数据库中的配置):

<?xml version="1.0" encoding="UTF-8"?> 
<database> 
    <url>jdbc:mysql://localhost:3306/db</url> 
    <driver>com.mysql.jdbc.Driver</driver> 
    <username>admin</username> 
    <password>admin</password> 
</database> 

输出是:

####Printing XML configuration:[url: null] [driver: null] [username: null] [password: null] 

回答

2

改变你的代码

  Element database = (Element) doc.getElementsByTagName("database").item(0); 
      String url = ((Element)database.getElementsByTagName("url").item(0)).getTextContent(); 
      String driver = ((Element)database.getElementsByTagName("driver").item(0)).getTextContent(); 
... 

或拨打方法

private static String getParameter(Element database, String paramName) { 
    return ((Element)database.getElementsByTagName(paramName).item(0)).getTextContent(); 
} 
3

toString()方法不会返回你认为它的作用。改为使用getTextContent()

更改此:

NodeList url = element.getElementsByTagName("url"); 
conf.url = url.item(0).toString(); 
NodeList driver = element.getElementsByTagName("driver"); 
conf.driver = driver.item(0).toString(); 
NodeList username = element.getElementsByTagName("username"); 
conf.username = username.item(0).toString(); 
NodeList password = element.getElementsByTagName("password"); 
conf.password = password.item(0).toString(); 

这样:

NodeList url = element.getElementsByTagName("url"); 
conf.url = url.item(0).getTextContent(); 
NodeList driver = element.getElementsByTagName("driver"); 
conf.driver = driver.item(0).getTextContent(); 
NodeList username = element.getElementsByTagName("username"); 
conf.username = username.item(0).getTextContent(); 
NodeList password = element.getElementsByTagName("password"); 
conf.password = password.item(0).getTextContent(); 

一点题外话,你几乎可以肯定在这里重新发明轮子。根据您的框架,Web服务器,应用程序服务器等,最好使用内置的数据库配置/连接管理工具。

+0

我只是想提供我的客户的可能性,以在不提供源代码的情况下更改我的桌面应用程序的数据库详细信息,我不会重新发明任何东西,只是良好的做法,而不是声称学分。感谢您的帮助 – RNO 2013-02-11 18:14:15

+0

@RNO:即使在这种情况下,您也可以使用['java.util.Properties'](http://docs.oracle.com/javase/6/docs/api/java/util/ Properties.html),它有内置的方法来读写'.properties'文件和'xml'文件。请参见['Properties#loadFromXML()'](http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#loadFromXML(java.io.InputStream))和['Properties #storeToXML()'](http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#storeToXML(java.io.OutputStream中,%20java.lang.String))。不需要自己解析'xml'。 – Asaph 2013-02-11 19:55:31

2

使用getTextContent代替,例如:

conf.url = url.item(0).getTextContent();