Каков наилучший/самый простой способ чтения в 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/