【问题标题】:Java: Null values parsing XML fileJava:空值解析 XML 文件
【发布时间】:2013-01-26 18:20:52
【问题描述】:

我正在尝试解析一个 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] 

【问题讨论】:

    标签: java mysql xml xmlreader


    【解决方案1】:

    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 服务器、应用服务器等,您最好使用内置的数据库配置/连接管理工具。

    【讨论】:

    • 我只是想为我的客户提供在不提供源代码的情况下更改我的桌面应用程序的数据库详细信息的可能性,我没有重新发明任何东西,只是一种良好的做法,而不是要求积分。感谢您的帮助
    • @RNO:即使在这种情况下,您也可以使用java.util.Properties 类,它具有从.properties 文件和xml 文件读取和写入的内置方法。请参阅Properties#loadFromXML()Properties#storeToXML()。无需自己解析xml
    【解决方案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】:

      请改用getTextContent,例如:

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

      【讨论】:

        猜你喜欢
        • 2015-10-26
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        相关资源
        最近更新 更多