在Java应用程序中读取XML文件的最佳/最简单的方法是什么?
目前我们的Java应用程序使用制表符分隔的* .cfg文件中的值。 我们需要改变这个应用程序,以便它现在使用一个XML文件。
什么是最好/最简单的库来使用从这个文件中读取值?
当然,根据你的需求,有很多好的解决scheme。 如果只是configuration,你应该看看雅加达的公共configuration和公共沼气池 。
你总是可以使用标准的JDK获取文档的方法:
import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; [...] File file = new File("some/path"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(file);
XML代码:
<?xml version="1.0"?> <company> <staff id="1001"> <firstname>yong</firstname> <lastname>mook kim</lastname> <nickname>mkyong</nickname> <salary>100000</salary> </staff> <staff id="2001"> <firstname>low</firstname> <lastname>yin fong</lastname> <nickname>fong fong</nickname> <salary>200000</salary> </staff> </company>
Java代码:
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; public class ReadXMLFile { public static void main(String argv[]) { try { File fXmlFile = new File("/Users/mkyong/staff.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("staff"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Staff id : " + eElement.getAttribute("id")); System.out.println("First Name : " + eElement.getElementsByTagName("firstname") .item(0).getTextContent()); System.out.println("Last Name : " + eElement.getElementsByTagName("lastname") .item(0).getTextContent()); System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname") .item(0).getTextContent()); System.out.println("Salary : " + eElement.getElementsByTagName("salary") .item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
输出:
---------------- Root element :company ---------------------------- Current Element :staff Staff id : 1001 First Name : yong Last Name : mook kim Nick Name : mkyong Salary : 100000 Current Element :staff Staff id : 2001 First Name : low Last Name : yin fong Nick Name : fong fong Salary : 200000
我build议你阅读下面的内容: 使用javaparsingDOM的规范化 – 它是如何工作的?
示例源。
你有selectXMLconfiguration文件的特定原因吗? 过去,我已经完成了XMLconfiguration,而且往往比其他任何事情都更令人头疼。
我想真正的问题是,使用像Preferences API这样的东西可能在你的情况下效果更好。
使用Preferences API而不是使用Roll-Your-own XML解决scheme的原因:
-
避免典型的XML丑陋(DocumentFactory等),同时避免第三方库提供XML后端
-
内置支持默认值(不需要特殊处理丢失/损坏/无效的条目)
-
不需要清理XML存储的值(CDATA包装等)
-
后备存储的保证状态(不需要不断地将XML写入磁盘)
-
备份存储是可configuration的(在磁盘上的文件,LDAP等)
-
multithreading免费访问所有的偏好
什么是最好/最简单的库来使用从这个文件中读取值?
当你要求最简单的图书馆时,我觉得有必要增加一个与Guillaume的最高票数答案完全不同的方法。 (其他答案,sjbotha的JDOM提到最接近我的build议)。
我认为对于Java中的XML处理,使用标准的JDK工具当然不是最简单的方法,而且只有在某些情况下(比如不能使用第三方库,出于某种原因),它是最好的办法。
相反,可以考虑使用一个好的XML库,比如XOM 。 以下是如何将XML文件读入nu.xom.Document
对象:
import nu.xom.Builder; import nu.xom.Document; import java.io.File; [...] File file = new File("some/path"); Document document = new Builder().build(file);
所以,这只是简单一点,因为读取文件到org.w3c.dom.Document
也不是很复杂,在“纯JDK”的方法。 但是使用一个好的图书馆的好处只能从这里开始! 无论您使用XML如何操作,当使用像XOM这样的库时,您通常会得到更简单的解决scheme,而更less的自己的代码需要维护。 作为例子,考虑这个与此 ,或者这与此 ,或者这篇文章包含XOM和W3C DOM例子 。
其他人将会提供反驳( 像这些 )为什么坚持到Java的标准XML API可能是值得的 – 这些可能是有价值的,至less在某些情况下,虽然个人我不订阅所有这些。 在任何情况下,当select一种方式或另一种方式时,意识到故事的双方是很好的。
(这个答案是我对XOM评估的一部分,这是我寻求最好的Java XML库来取代dom4j的有力竞争者。)
看看JAXB 。
JAXB使用简单,并包含在Java 6 SE中。 使用JAXB或其他XML数据绑定(如Simple),您不必自己处理XML,大部分工作都由库完成。 基本用法是添加注释到你现有的POJO。 然后,这些注释用于为您的数据生成XML模式,以及在从文件读取/写入数据时使用。
我只用了jdom。 这很容易。
去这里获取文档并下载它: http : //www.jdom.org/
如果你有一个非常大的文档,那么最好不要把它全部读入内存,而是使用一个SAXparsing器,它会调用你的方法,因为它碰到特定的标签和属性。 您必须创build一个状态机来处理来电。
根据您的应用程序和cfg文件的范围,属性文件可能是最简单的。 当然,它不像XML那样优雅,但它确实更容易。
从1.4开始使用java.beans.XMLDecoder
,作为核心Java SE的一部分。
XMLDecoder input = new XMLDecoder(new FileInputStream("some/path.xml")); MyConfig config = (MyConfig) input.readObject(); input.close();
手动编写configuration文件很容易,或者使用相应的XMLEncoder
和一些设置在运行时写入新的对象。
最简单的将是Simple http://simple.sourceforge.net ,你只需要像这样注释一个单一的对象
@Root public class Entry { @Attribute private String a @Attribute private int b; @Element private Date c; public String getSomething() { return a; } } @Root public class Configuration { @ElementList(inline=true) private List<Entry> entries; public List<Entry> getEntries() { return entries; } }
然后,您只需要指定位置即可parsing并填充注释的POJO。 这将做所有的types转换和validation。 如果需要,您也可以注释persistcallback。 读它可以这样做。
Serializer serializer = new Persister(); Configuration configuraiton = serializer.read(Configuration.class, fileLocation);
这真的让我更容易。 当我正在阅读由旧版本的软件保存的configuration文件,或者由用户手动编辑时,这是特别好的。 这是非常健壮的,不会抛出一个exception,如果一些数据不完全符合你期望的格式。
下面是一个非常简单的API,我用Java读取简单的XML文件。 这是非常简单和易于使用。 希望它对你有用。