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

rmc*_*mcc 52 java xml file

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

为了从这个文件中读取值,最好/最简单的库是什么?

Gui*_*ume 53

当然,根据您的需求,有很多好的解决方案.如果只是配置,你应该看看Jakarta 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);
Run Code Online (Sandbox Code Playgroud)

  • 您没有显示如何读取属性和上下文.:( (9认同)
  • 同意.这是我首选的读取配置文件等小型XML文件的方法.结合XPath使你的配置参数更加挑剔. (4认同)

Ran*_*ler 33

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>
Run Code Online (Sandbox Code Playgroud)

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

----------------

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
Run Code Online (Sandbox Code Playgroud)

我建议你阅读这篇:用java解析DOM中的规范化 - 它是如何工作的?

示例来源.

  • +1实际显示如何读取数据...最好的答案不是. (2认同)

Jam*_*uis 10

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

我想真正的问题是,使用Preferences API之类的东西在你的情况下是否会更好.

在自己动手的XML解决方案上使用Preferences API的原因:

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

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

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

  • 保证后备存储的状态(不需要经常将XML写入磁盘)

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

  • 免费多线程访问所有首选项


Jon*_*nik 8

为了从这个文件中读取值,最好/最简单的库是什么?

当你要求最简单的库时,我觉得有必要添加一种与Guillaume最高投票答案完全不同的方法.(在其他答案中,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);
Run Code Online (Sandbox Code Playgroud)

所以,这只是一点点简单,因为org.w3c.dom.Document在"纯JDK"方法中读取文件也不是很复杂.但是,使用一个好的库的优势只从这里开始!无论您使用XML做什么,在使用像XOM这样的库时,您通常会使用更简单的解决方案,而不需要维护自己的代码.作为例子,认为这个,或同时含有XOM和W3C DOM的例子这篇文章.

其他人将提供反对论据(如这些)为什么坚持Java的标准XML API可能是值得的 - 这些可能有价值,至少在某些情况下,尽管个人我不订阅所有这些.在任何情况下,当选择一种方式或另一种方式时,最好注意故事的两个方面.

(这个答案是我对XOM评估的一部分,XOM是我寻找最好的Java XML库来取代dom4j的有力竞争者.)

  • 哦,我同意那些指出XML可能不一定是最好的选择的人,但为了这个答案的目的,我假设XML /是/使用过 (2认同)