在Java应用程序中读取XML文件的最佳/最简单方法是什么?

时间:2009-01-09 13:41:44

标签: java xml file

目前,我们的Java应用程序使用制表符分隔的* .cfg文件中保存的值。我们需要更改此应用程序,以便它现在使用XML文件。

从该文件中读取值时,最好/最简单的库是什么?

12 个答案:

答案 0 :(得分:52)

根据您的需要,当然有很多好的解决方案。如果只是配置,您应该查看雅加达commons-configurationcommons-digester

您始终可以使用标准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);

答案 1 :(得分:32)

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

我建议你阅读:Normalization in DOM parsing with java - how does it work?

Example source.

答案 2 :(得分:10)

您是否选择了XML配置文件?我过去曾经做过XML配置,而且它们往往比其他任何事情更令人头疼。

我想真正的问题是,使用像Preferences API这样的东西在你的情况下是否会更好。

使用首选项API而不是自己动手的XML解决方案的原因:

  • 避免典型的XML丑陋(DocumentFactory等),同时避免第三方库提供XML后端

  • 内置支持默认值(丢失/损坏/无效条目无需特殊处理)

  • 无需清理XML存储的值(CDATA包装等)

  • 支持商店的保证状态(无需经常将XML写入磁盘)

  • 支持商店是可配置的(磁盘上的文件,LDAP等)

  • 免费对所有偏好设置进行多线程访问

答案 3 :(得分:7)

  

什么是最好/最简单的库   用于从中读取值   这个档案?

当你要求最简单的库时,我觉得有必要添加一种与Guillaume's top-voted answer完全不同的方法。 (在其他答案中,sjbotha的JDOM提及最接近我的建议)。

我认为对于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);

所以,这只是一点点简单,因为在“纯JDK”方法中将文件读入org.w3c.dom.Document也不是很复杂。但是,使用一个好的库的优势只从这里开始!无论您使用XML做什么,在使用像XOM这样的库时,您通常会使用更简单的解决方案,而不需要维护自己的代码。例如,请考虑thisthis,或thisthisthis post containing both XOM and W3C DOM examples

其他人会提供反对论证(like these)为什么坚持使用Java的标准XML API可能是值得的 - 这些可能有价值,至少在某些情况下,尽管我个人并不认同所有他们。在任何情况下,当选择一种方式或另一种方式时,最好注意故事的两个方面。

(这个答案是我对XOM的评价的一部分,这是我quest for finding the best Java XML library to replace dom4j中的强有力竞争者。)

答案 4 :(得分:3)

查看JAXB

答案 5 :(得分:3)

JAXB易于使用,并包含在Java 6 SE中。使用JAXB或其他XML数据绑定(如Simple),您不必自己处理XML,大部分工作都是由库完成的。基本用法是为现有POJO添加注释。然后,这些注释用于为您的数据生成XML模式,以及从/向文件读取/写入数据时。

答案 6 :(得分:2)

我只使用过jdom。这很容易。

到此处查找文档并下载:http://www.jdom.org/

如果你有一个非常大的文档,那么最好不要将它全部读入内存,而是使用SAX解析器调用你的方法,因为它会触及某些标记和属性。然后,您必须创建一个状态机来处理来电。

答案 7 :(得分:1)

到目前为止最简单的将是简单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;
   }
}

然后你需要做的就是读取整个文件是指定位置,它将解析并填充带注释的POJO。这将执行所有类型转换和验证。如果需要,您还可以注释persister回调。阅读它可以这样做。

Serializer serializer = new Persister();
Configuration configuraiton = serializer.read(Configuration.class, fileLocation);

答案 8 :(得分:1)

根据您的应用程序和cfg文件的范围,属性文件可能是最简单的。当然它不如xml那么优雅,但它肯定更容易。

答案 9 :(得分:1)

使用java.beans.XMLDecoder,自1.4以来的核心Java SE的一部分。

XMLDecoder input = new XMLDecoder(new FileInputStream("some/path.xml"));
MyConfig config = (MyConfig) input.readObject();
input.close();

write the configuration files by hand很容易,或者在运行时使用相应的XMLEncoder进行一些设置来编写新对象。

答案 10 :(得分:0)

这就是我使用的。 http://marketmovers.blogspot.com/2014/02/the-easy-way-to-read-xml-in-java.html它位于标准JDK工具之上,因此如果它缺少某些功能,您可以始终使用JDK版本。

这对我来说真的很容易。当我阅读由该软件保存的配置文件或由用户手动编辑的配置文件时,它特别好。它非常强大,如果某些数据不完全符合您的预期格式,则不会抛出异常。

答案 11 :(得分:-1)

这是一个非常简单的API,我用它来读取Java中的简单XML文件。它非常简单易用。希望它对你有用。

http://argonrain.wordpress.com/2009/10/27/000/