Каков наилучший / самый простой способ чтения в файле XML в приложении Java?
В настоящее время наше Java-приложение использует значения, хранящиеся в файле *.cfg с разделителями табуляции. Нам нужно изменить это приложение, чтобы оно теперь использовало файл XML.
Какую наилучшую / простую библиотеку использовать для чтения значений из этого файла?
12 ответов
Конечно, есть много хороших решений, основанных на том, что вам нужно. Если это просто конфигурация, вы должны взглянуть на Jakarta http://commons.apache.org/configuration/ и http://commons.apache.org/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);
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 - как это работает?
Какую наилучшую / простую библиотеку использовать для чтения значений из этого файла?
Поскольку вы просите простейшую библиотеку, я чувствую себя обязанным добавить подход, совершенно иной, чем в ответе Гийома с самым высоким рейтингом. (Из других ответов упоминание JDOM у sjbotha наиболее близко к тому, что я предлагаю).
Я пришел к выводу, что для обработки 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. В качестве примеров рассмотрите это против этого, или это против этого, или этот пост, содержащий примеры как XOM, так и W3C DOM.
Другие предоставят контраргументы ( подобные этим), почему стоит придерживаться стандартных API-интерфейсов Java Java - это, вероятно, имеет смысл, по крайней мере, в некоторых случаях, хотя лично я не подписываюсь на все из них. В любом случае, выбирая тот или иной путь, хорошо осознавать обе стороны истории.
(Этот ответ является частью моей оценки XOM, который является сильным конкурентом в моих поисках лучшей библиотеки Java XML для замены dom4j.)
Есть ли конкретная причина, по которой вы выбрали файлы конфигурации XML? Я делал XML-конфигурации в прошлом, и они часто оказывались скорее головной болью, чем что-либо еще.
Я предполагаю, что реальный вопрос заключается в том, может ли использование чего-то вроде Preferences API работать лучше в вашей ситуации.
Причины использования Preferences API над XML-решением, созданным по принципу "сворачивайся":
Позволяет избежать типичного уродства XML (DocumentFactory и т. Д.), А также избегать сторонних библиотек для предоставления XML-бэкенда
Встроенная поддержка значений по умолчанию (не требуется специальной обработки для пропущенных / поврежденных / недействительных записей)
Нет необходимости очищать значения для хранения XML (обтекание CDATA и т. Д.)
Гарантированное состояние резервного хранилища (нет необходимости постоянно записывать XML на диск)
Резервное хранилище настраивается (файл на диске, LDAP и т. Д.)
Многопоточный доступ ко всем настройкам бесплатно
JAXB прост в использовании и включен в Java 6 SE. С JAXB или другими привязками данных XML, такими как Simple, вам не нужно обрабатывать XML самостоятельно, большая часть работы выполняется библиотекой. Основное использование заключается в добавлении аннотации к существующему POJO. Эти аннотации затем используются для создания схемы XML для ваших данных, а также при чтении / записи ваших данных из / в файл.
Я использовал только JDOM. Это довольно легко.
Перейдите сюда для получения документации и ее загрузки: http://www.jdom.org/
Если у вас очень большой документ, лучше не читать его все в память, а использовать SAX-анализатор, который вызывает ваши методы, когда он попадает в определенные теги и атрибуты. Затем необходимо создать конечный автомат для обработки входящих вызовов.
В зависимости от вашего приложения и области действия файла cfg файл свойств может быть самым простым. Конечно, это не так элегантно, как XML, но это, безусловно, проще.
Самым простым из них будет Simple 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);
Использование java.beans.XMLDecoder
, часть ядра Java SE с 1.4.
XMLDecoder input = new XMLDecoder(new FileInputStream("some/path.xml"));
MyConfig config = (MyConfig) input.readObject();
input.close();
Файлы конфигурации легко написать вручную или использовать соответствующие XMLEncoder
с некоторыми настройками для записи новых объектов во время выполнения.
Это то, что я использую. http://marketmovers.blogspot.com/2014/02/the-easy-way-to-read-xml-in-java.html Он находится поверх стандартных инструментов JDK, поэтому, если в нем отсутствует какая-либо функция, вы всегда можете используйте версию JDK.
Это действительно облегчает мне жизнь. Это особенно приятно, когда я читаю файл конфигурации, который был сохранен в более ранней версии программного обеспечения или был отредактирован пользователем вручную. Это очень надежно и не выдает исключение, если некоторые данные не совсем в том формате, который вы ожидаете.
Вот действительно простой API, который я создал для чтения простых XML-файлов в Java. Это невероятно просто и легко в использовании. Надеюсь, это полезно для вас.