以前都是在c++中我都是习惯用ini配置文件,接触webx框架后,一般都是用得配置好的xml文件,偷懒结果就是把自己给坑了。在需要自定义配置文件的之后踩到了坑,特此记录下。
此处我想读取名为test.xml文件中的配置信息。
第一步就是要获取这个文件的路径:
千万不要使用System.getProperty("user.dir");
这java应用中可以获取到的工程目录,但是在web应用中却不行,web应用中用的都是运行时路径,比如用tomcat启动的应用,可能加载test.xml文件时的路径可能就像
tomcat/deploy/ROOT/WEB-INF/lib/mytest.jar!/
这时候的路径就和普通的本地java应用的路径不一样。应该利用类加载路径classpath来获取文件路径。比如:
java.net.URL configUrl= this.getClass().getResource(File.separator+ "aNewTest/test.xml");
此处File.separator相当于一个左斜杠“/',因为linux环境用的分隔符是”/“,而Windows文件路径中用的风格符是”\“,所以File.separator可以满足兼容性的需要,如下的格式在两种 平台上都适用
java.net.URL configUrl= this.getClass().getResource(File.separator+ "aNewTest"+File.separator+"test.xml");
获取文件路径还可以用另外一种方式,就是利用classLoader
java.net.URL configUrl = Thread.currentThread().getContextClassLoader().getResource("aNewTest"+File.separator+"test.xml");
两种方式有稍微的却别,第二种方式在传入参数的时候字符串开头是不需要 文件分隔符"/"或者“\”,不能弄混淆,否则就会报错找不到文件了。
第二步就是读取配置文件中的内容:
利用jdom就可以了,先引包
然后通过第一步中的文件路径读取配置文件
Document document = new SAXBuilder().build(configUrl);//获取文件
Element root = document.getRootElement();//获取到xml文件的根节点元素
Element mytest=root.getChild("test");//通过根节点获取到它的直属子节点test元素
mytest.setText("hello word")//可以给某一个节点设置value
StringWriter writer = new StringWriter();
new XMLOutputter().output(document, writer);//将文档内容写进StringWriter
String temp=writer.toString();//转换成自己想要的字符串
writer.close();
在使用 new SAXBuilder().build(configUrl)的时候,
参数最好传入文件的URL地址或者是InputStream对象,如果直接使用文件的字符串地址很容易出错,使用字符串地址如果是硬盘绝对路径那可以运行,否则在web应用中肯定会报错,比如用如下的方式肯定就会报错,千万不要使用
String configPath= this.getClass().getResource(File.separator + "aNewTest"+File.separator+"test.xml").getPath();
Document document = new SAXBuilder().build(configPath);
这样就会报找不到指定文件的error了