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

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

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

Ответ 1

Конечно, есть много хороших решений, основанных на том, что вам нужно. Если это просто конфигурация, вы должны взглянуть на Jakarta commons-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);

Ответ 2

Код 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 - как это работает?

Пример источника.

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

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

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

Я пришел к выводу, что для обработки XML в Java, использование стандартных инструментов JDK, безусловно, не, самый простой способ и что только в некоторых случаях (например, неспособность использовать 3-й партийные библиотеки, по какой-то причине) это лучший способ.

Вместо этого рассмотрите возможность использования хорошей библиотеки XML, например XOM. Здесь, как прочитать XML файл в nu.xom.Document object:

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 vs. this, или этот пост, содержащий примеры DOM XOM и W3C.

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

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

Ответ 5

Посмотрите JAXB.

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

Простейшим на сегодняшний день будет простой 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);

Ответ 11

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

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

Ответ 12

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

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