Каков наилучший / самый простой способ чтения файла XML в приложении Java?

В настоящее время наше приложение Java использует значения, содержащиеся в файле * .cfg с разделителями табуляцией. Нам нужно изменить это приложение, чтобы оно теперь использовало XML-файл.

Какую библиотеку лучше / проще использовать для чтения значений из этого файла?


person rmcc    schedule 09.01.2009    source источник


Ответы (12)


Конечно, есть много хороших решений, основанных на том, что вам нужно. Если это просто конфигурация, вам следует взглянуть на commons-configuration Джакарты и commons-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);
person Guillaume    schedule 09.01.2009
comment
Согласованный. Это мой предпочтительный безотказный способ чтения небольших файлов XML, таких как файлы конфигурации. Совместите с XPath, чтобы упростить выбор параметров конфигурации. - person Neil Coffey; 10.01.2009
comment
Вы ничего не показываете о том, как читать атрибуты и контекст. :( - person chrisapotek; 11.09.2014
comment
установите для функции безопасную обработку значение true, чтобы избежать атак XXE: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - person myhouse; 06.08.2019

Код 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

Я рекомендовал вам прочитать это: Нормализация в парсинге DOM с помощью java - как это работает?

Пример исходного кода.

person Ran Adler    schedule 20.06.2013
comment
Я бы сказал, что это лучший способ сделать это, вы получите больше контроля над преобразованием и тем, как вы хотите создавать объекты, я попробовал dom4j, но это не удалось, потому что клиент отправлял неожиданное пространство имен, о котором мне ранее говорили, что мы можем отправить некоторые неожиданные поля или узел в XML-запросе. - person Mubashar; 13.06.2014
comment
+1 за то, что на самом деле показывает, как читать данные ... лучший ответ - нет. - person chrisapotek; 11.09.2014
comment
в следующий раз я буду использовать JAXB - person Ran Adler; 18.03.2015
comment
Я знаю, что это устарело, но, боже мой, это болезненно по сравнению с чтением файлов XML на C #. Действительно ли это лучший способ чтения XML-данных на Java? - person Anonymous; 19.09.2018
comment
это определенно не лучший способ - person Ran Adler; 20.09.2018
comment
установите для функции безопасную обработку значение true, чтобы избежать атак XXE: DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - person myhouse; 06.08.2019

Есть ли конкретная причина, по которой вы выбрали файлы конфигурации XML? Я делал конфигурации XML в прошлом, и они часто оказывались больше головной болью, чем что-либо еще.

Я предполагаю, что реальный вопрос заключается в том, можно ли использовать что-то вроде Preferences API может работать лучше в вашей ситуации.

Причины использовать Preferences API вместо самостоятельного решения XML:

  • Избегает типичного уродства XML (DocumentFactory и т. Д.), А также избегает сторонних библиотек для обеспечения бэкэнда XML

  • Встроенная поддержка значений по умолчанию (не требуется специальной обработки для отсутствующих / поврежденных / недействительных записей)

  • Нет необходимости очищать значения для хранилища XML (упаковка CDATA и т. Д.)

  • Гарантированный статус резервного хранилища (нет необходимости постоянно записывать XML на диск)

  • Резервное хранилище настраивается (файл на диске, LDAP и т. Д.)

  • Многопоточный доступ ко всем настройкам бесплатно

person James Van Huis    schedule 09.01.2009
comment
Предпочтения api имеет вывод xml;) java.sun .com / javase / 6 / docs / api / java / util / prefs / Preferences.html. - person Harald Schilly; 23.01.2009

Какую библиотеку лучше / проще использовать для чтения значений из этого файла?

Поскольку вы запрашиваете простейшую библиотеку, я считаю своим долгом добавить подход, совершенно отличный от того, который описан в ответ Гийома, получивший наибольшее количество голосов. (Из других ответов упоминание sjbotha JDOM ближе всего к тому, что я предлагаю).

Я пришел к выводу, что для обработки XML в Java использование стандартных инструментов 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. В качестве примеров рассмотрим this по сравнению с this или this по сравнению с this или этот пост, содержащий примеры XOM и W3C DOM.

Другие представят контраргументы (подобные этим), почему придерживаются Стандартные XML API Java могут того стоить - они, вероятно, имеют свои достоинства, по крайней мере, в некоторых случаях, хотя лично я не подписываюсь на все из них. В любом случае, выбирая тот или иной путь, хорошо знать обе стороны истории.

(Этот ответ является частью моей оценки XOM, который является сильным соперником в моем поиск лучшей библиотеки Java XML для замены dom4j.)

person Jonik    schedule 08.06.2009
comment
О, я согласен с теми, кто указал, что XML не обязательно может быть лучшим выбором здесь вообще, но для целей этого ответа я предположил, что XML / используется / - person Jonik; 08.06.2009

JAXB прост в использовании и включен в Java 6 SE. С JAXB или другим связыванием данных XML, таким как Simple, вам не нужно обрабатывать XML самостоятельно, большая часть работы выполняется библиотекой. Основное использование - добавить аннотацию к существующему POJO. Эти аннотации затем используются для создания XML-схемы для ваших данных, а также при чтении / записи ваших данных из / в файл.

person Pierre Buyle    schedule 10.01.2009

Загляните в JAXB.

person cletus    schedule 09.01.2009

Я использовал только jdom. Это довольно просто.

Перейдите сюда, чтобы получить документацию и загрузить ее: http://www.jdom.org/

Если у вас очень-очень большой документ, лучше не зачитывать его все в память, а использовать парсер SAX, который вызывает ваши методы при попадании в определенные теги и атрибуты. Затем вам нужно создать конечный автомат для обработки входящих вызовов.

person Sarel Botha    schedule 09.01.2009

Самым простым на сегодняшний день будет Простой 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. Это выполнит все преобразования типов и проверку. При необходимости вы также можете добавлять аннотации для постоянных обратных вызовов. Читать его можно так.

Serializer serializer = new Persister();
Configuration configuraiton = serializer.read(Configuration.class, fileLocation);
person ng.    schedule 09.01.2009
comment
с xstream вам не нужно ничего аннотировать ... - person willcodejavaforfood; 09.01.2009
comment
Чтобы адаптировать XML-схему, вам нужно ее описать, аннотации - вполне допустимое средство для этого. JAXB, сериализация C # XML и даже XStream использовали для этого аннотации. Мы не говорим о сериализации, здесь мы говорим о структурированной схеме XML, отображаемой на объект. - person ng.; 10.01.2009

В зависимости от вашего приложения и объема файла cfg, файл свойств может быть самым простым. Конечно, это не так элегантно, как xml, но определенно проще.

person tmeisenh    schedule 09.01.2009

Используйте java.beans.XMLDecoder, часть ядра Java SE начиная с версии 1.4.

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

Легко написать файлы конфигурации вручную или использовать соответствующий XMLEncoder с некоторыми настройками для писать новые объекты во время выполнения.

person erickson    schedule 10.01.2009

Это то, что я использую. http://marketmovers.blogspot.com/2014/02/the-easy-way-to-read-xml-in-java.html Он находится поверх стандартных инструментов JDK, поэтому, если в нем отсутствует какая-либо функция, вы всегда можете использовать JDK. версия.

Это действительно облегчает мне жизнь. Это особенно приятно, когда я читаю файл конфигурации, который был сохранен более старой версией программного обеспечения или был вручную отредактирован пользователем. Он очень надежен и не вызовет исключения, если некоторые данные не совсем в том формате, который вы ожидаете.

person Trade-Ideas Philip    schedule 18.02.2014

Вот действительно простой API, который я создал для чтения простых XML-файлов на Java. Это невероятно просто и удобно. Надеюсь, это будет полезно для вас.

http://argonrain.wordpress.com/2009/10/27/000/ < / а>

person Chris    schedule 26.03.2010