在Java开发中,XML配置文件是一种常用的数据存储和配置方式,它允许开发者将配置信息与代码分离,提高代码的可维护性和灵活性,本文将详细介绍如何在Java中读取XML配置文件,包括基本概念、常用方法以及注意事项。
XML配置文件的基本概念
XML(eXtensible Markup Language)是一种标记语言,用于存储和传输数据,它具有以下特点:
Java读取XML配置文件的方法
在Java中,读取XML配置文件主要有以下几种方法:
DOM解析
DOM(Document Object Model)是一种将XML文件解析为树形结构的方法,以下是使用DOM解析XML配置文件的步骤:
SAX解析
SAX(Simple API for XML)是一种基于事件的解析方式,以下是使用SAX解析XML配置文件的步骤:
JAXB解析
JAXB(Java Architecture for XML Binding)是一种将XML数据映射到Java对象的方法,以下是使用JAXB解析XML配置文件的步骤:
XML配置文件读取示例
以下是一个使用DOM解析XML配置文件的示例:
import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class XMLReader {public static void main(String[] args) {try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse("config.xml");NodeList nodeList = document.getElementsByTagName("property");for (int i = 0; i < nodeList.getLength(); i++) {Element element = (Element) nodeList.item(i);String name = element.getAttribute("name");String value = element.getTextContent();System.out.println(name + ": " + value);}} catch (Exception e) {e.printStackTrace();}}}
注意事项
Q1:如何解决XML配置文件中的中文乱码问题?
在读取XML文件时,可以设置编码格式,使用DOM解析器时,可以在
DocumentBuilder
的构造函数中设置编码格式:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setXMLParserProperty("http://apache.org/xml/properties/editor", "UTF-8");DocumentBuilder builder = factory.newDocumentBuilder();
Q2:如何将Java对象转换为XML配置文件?
可以使用JAXB框架将Java对象转换为XML配置文件,以下是一个简单的示例:
import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;public class Main {public static void main(String[] args) {JAXBContext context = JAXBContext.newInstance(MyObject.class);Marshaller marshaller = context.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);MyObject myObject = new MyObject();myObject.setName("张三");myObject.setAge(25);marshaller.marshal(myObject, System.out);}}
在这个示例中,类是Java对象,方法将对象转换为XML配置文件并输出到控制台。
数据库连接池的DataSource ds=(DataSource)ctx.lookup(ds)出错
public class DBI {private static DBI dbi = new DBI();private static DataSource ds = null;public static DBI getInstance() { return dbi;}private Connection getConnection() throws SQLException { String datasource = java:comp/env/mysqlds; Connection conn = null; Enumeration e = null; try {if (ds == null) { InitialContext ctx = new InitialContext(); ds = (DataSource) (datasource);} } catch (NamingException ne) {throw new SQLException(Lookup Datasource fail. + ()); } conn = (); return conn;}}和你自己的对比下,改改吧
java:ResourceBundle rb=ResourceBundle.getBundle("LocalString");
使用ResourceBundle访问本地资源在设计时,我们往往需要访问一些适合本地修改的配置信息,如果作为静态变量,那么每次修改都需要重新编译一个class,保存此类信息并不适合,这时我们需要ResourceBundle。 通过ResourceBundle,我们需要访问位于/WEB-INF/classes目录下的一个后缀名为properties的文本类型文件,从里面读取我们需要的值。 Locale locale = ();ResourceBundle localResource = (ConnResource, locale);String value = (test);(ResourceBundle: + value);这里对应了/WEB-INF/class/文件内容为:test=hello world打印出来的结果就是hello world请注意,这里我们可以利用Locale和ResourceBundle的这个组合创建国际化的java程序。 我们可以把locale实例化为new Locale(zh,CN);通过(MessagesBundle, locale);系统将自动寻找MessagesBundle_zh_CN,即定义为中国大陆地区简体中文。 如果没有该文件,则会依次寻找MessagesBundle_zh,MessagesBundle,直到找到为止
Android-Lint 检查有关问题列表怎么解决
定制android-lint检查问题的现有规则对android-lint发现的问题进行处理。 可定制项目中采用的规则。 android-lint检查问题列表android sdk tools / adt 20.0.3中所支持的默认检查的所有问题。 有英文版本和中文版本。 英文版本从android-lint中直接导出;中文版本还不完整,对每一条的解释会逐步完善。 android sdk自带的apidemo用android-lint检查一下,也还报了很多的问题。 一、忽略xml文件中的问题1.1 missingprefix问题layout的Device_admin_文件中定义了下面的button[html] view plaincopyprint?android:id=@+id/set_password android:layout_width=wrap_content android:layout_height=wrap_content android_layout_gravity=east|center_vertical android:text=@string/set_password>android:id=@+id/set_password android:layout_width=wrap_content android:layout_height=wrap_content android_layout_gravity=east|center_vertical android:text=@string/set_password>执行android-lint就会报missingprefix警告:1.2 解决xml中的问题可以在lint warnings view中解决(图中图标从左至右顺序)suppress this error with an annotation/attribute点击该图标之后,直接更改了device_admin_文件:[html] view plaincopyprint?android:id=@+id/set_password android:layout_width=wrap_content android:layout_height=wrap_content android_layout_gravity=east|center_vertical android:text=@string/set_password tools:ignore=missingprefix >android:id=@+id/set_password android:layout_width=wrap_content android:layout_height=wrap_content android_layout_gravity=east|center_vertical android:text=@string/set_password tools:ignore=missingprefix >xml文件中直接增加了tools:ignore=missingprefix。 ignore in this file在本文件中忽略,而在别的文件中仍然出现。 ignore in this project当前项目中都忽略该issue。 执行之后,在本项目根目录下创建了的文件,内容为:[html] view plaincopyprint? always ignore所有项目中都忽略。 [tips#1] ignore in this project和always ignore操作,同执行lint warnings view中的最后一个icon --options…,然后配置某一个项目或者全局设置中该issue的severity为ignore。 [tips#2] eclipse中的实现有bug,有时设置了这些ignore操作,即便立即执行检查也不一定生效,需要重启eclipse。 二、解决java代码中的问题2.1 newapi问题apidemo中指明了支持最低api-1,但是代码里却用了api-3的接口,执行lint会报错:2.2 解决问题把光标放在报错代码处,会自动提示如何快速fix。 1. 前面红色圆角框内是用javaannotation方式解决(api-16之后才有):@suppresslint‘’或@targetapi() @suppresslint ‘’用来忽略。 适用范围在所调用的方法处或整个类中。 @targetapi()用来指示api用给定的,而不是项目中指定的。 适用范围在所调用的方法处或整个类中。 2. 后面粉红色圆角框内同xml中解决方式——在本文件/ 本项目/ 全局范围内忽略检查。 三、命令行下解决问题 从上面eclipse环境下的解决问题的方式知道,可以指定文件来定制lint检查issue的处理方式。 下面是一个的例子: [html] view plaincopyprint? 中关键是对issue(用id指定)的severity进行指定,并且可以指定该issue作用于指定的文件还是当前项目。 把放在项目的根目录中,命令行执行lint时候,lint就会用中的规则。 另外,执行lint时还可以用参数--config指定一个全局的配置用于所有的项目。 当项目中已有,则对于某个issue而言,在中没有对该issue特别定制的情况下,--config指定的文件中的该issue的定制才起作用。 四、定制lint检查的规则 android-lint有默认的检查和报错的规则,但通过上面的分析知道,可以在eclipse或者命令行下改变这种规则,从而可以定制lint检查的规则。 推荐定制的路线: 在eclipse中基于现有的问题,逐个分析并解决,然后我们就能得到一个eclipse自动生成的这个定制文件; 然后这个用于eclipse和/或命令行下进行后续的检查; 后续发现的问题再进一步处理,逐步完善这个定制文件。 当然,如果有足够的时间,完全也可以review一遍android-lint已经支持的所有的issue,对他们逐个进行定制。 对这些issue的 review,也能加深对android设计中问题解决和性能优化方法的理解。














发表评论