Я ищу библиотеку java для синтаксического анализа XML (сложная конфигурация и файлы данных), я немного искал Google, но не мог найти ничего, кроме dom4j (похоже, они работают на V2). Я взглянул на общедоступные конфигурации, но не понравилось, другие проекты Apache в XML, похоже, находятся в спящем режиме. Я сам не оценил dom4j, но просто хотел узнать - у java есть другая (хорошая) библиотека XML-анализа с открытым исходным кодом? и как ваш опыт работы с dom4j?
После ответа @Voo позвольте мне спросить другого - Должен ли я использовать java в построенных классах или в любой третьей библиотеке, например dom4j.. В чем преимущества?
На самом деле Java поддерживает 4 метода для разбора XML из коробки:
DOM Parser/Builder: вся структура XML загружается в память, и вы можете использовать хорошо известные методы DOM для работы с ней. DOM также позволяет вам писать в документ с преобразованиями Xslt. Пример:
public static void parse() throws ParserConfigurationException, IOException, SAXException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = factory.newDocumentBuilder();
File file = new File("test.xml");
Document doc = builder.parse(file);
// Do something with the document here.
}
SAX Parser: просто прочитать XML-документ. Парсер Sax проходит через документ и вызывает методы обратного вызова пользователя. Существуют методы для начала и конца документа, элемента и т.д. Они определены в org.xml.sax.ContentHandler и там пустой вспомогательный класс DefaultHandler.
public static void parse() throws ParserConfigurationException, SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
SAXParser saxParser = factory.newSAXParser();
File file = new File("test.xml");
saxParser.parse(file, new ElementHandler()); // specify handler
}
StAx Reader/Writer: это работает с интерфейсом, ориентированным на потоки данных. Программа запрашивает следующий элемент, когда он готов как курсор/итератор. Вы также можете создавать с ним документы. Читать документ:
public static void parse() throws XMLStreamException, IOException {
try (FileInputStream fis = new FileInputStream("test.xml")) {
XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
while(reader.hasNext()) {
reader.next(); // do something here
}
}
}
Записать документ:
public static void parse() throws XMLStreamException, IOException {
try (FileOutputStream fos = new FileOutputStream("test.xml")){
XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("test");
// write stuff
writer.writeEndElement();
}
}
JAXB: новейшая реализация для чтения XML-документов: Является частью Java 6 в v2. Это позволяет нам сериализовать java-объекты из документа. Вы читаете документ с классом, который реализует интерфейс для javax.xml.bind.Unmarshaller(вы получаете класс для этого из JAXBContext.newInstance). Контекст должен быть инициализирован используемыми классами, но вам просто нужно указать корневые классы и не нужно беспокоиться о статических ссылочных классах. Вы используете аннотации, чтобы указать, какие классы должны быть элементами (@XmlRootElement) и какие поля являются элементами (@XmlElement) или атрибутами (@XmlAttribute, какой сюрприз!)
public static void parse() throws JAXBException, IOException {
try (FileInputStream adrFile = new FileInputStream("test")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Unmarshaller um = ctx.createUnmarshaller();
RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
}
}
Записать документ:
public static void parse(RootElementClass out) throws IOException, JAXBException {
try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
Marshaller ma = ctx.createMarshaller();
ma.marshal(out, adrFile);
}
}
Примеры, бесстыдно скопированные с некоторых старых слайдов лекций; -)
Изменить: О "какой API shoild я использую?". Ну, это зависит - не все API имеют те же возможности, что и вы, но если у вас есть контроль над классами, которые вы используете для сопоставления XML-документа, JAXB - это мое личное любимое, действительно элегантное и простое решение (хотя я не использовал его для действительно большие документы, это может стать немного сложным). SAX довольно прост в использовании и просто держитесь подальше от DOM, если у вас нет по-настоящему веской причины использовать его - старый, неуклюжий API, на мой взгляд. Я не думаю, что есть современные библиотеки сторонних разработчиков, которые показывают что-то особенно полезное, что недостающие из stl и стандартных библиотек имеют обычные преимущества: быть очень хорошо протестированным, документированным и стабильным.
Java поддерживает два метода анализа XML из коробки.
SAXParser
Этот анализатор можно использовать, если вы хотите анализировать большие файлы XML и/или не хотите использовать много памяти.
http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html
Пример: http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/
DOMParser
Вы можете использовать этот синтаксический анализатор, если вам нужно делать запросы XPath или необходимо иметь доступную DOM.
http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html
Пример: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/
Для людей, заинтересованных в использовании JDOM, но боюсь, что это не обновлялось через некоторое время (особенно, не используя Java generics), есть вилка под названием CoffeeDOM, которая точно решает эти аспекты и модернизирует JDOM API, читайте здесь:
http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/
и загрузите его со страницы проекта по адресу:
Никита-точка отличная: не путайте зрелых с плохими. XML не сильно изменился.
JDOM будет другой альтернативой DOM4J.
Вам не нужна внешняя библиотека для синтаксического анализа XML на Java. Java со встроенными реализациями для SAX и DOM уже давно.
Если вам нужен DOM-подобный API, то есть тот, где синтаксический анализатор XML превращает документ в дерево узлов Element и Attribute, тогда есть как минимум четыре варианта: DOM, JDOM, DOM4J и XOM. Единственная возможная причина использования DOM заключается в том, что она воспринимается как стандарт и поставляется в JDK: во всех остальных отношениях все являются превосходными. Мое предпочтение, за его сочетание простоты, мощности и производительности, - это XOM.
И, конечно же, существуют и другие типы обработки: низкоуровневые парсер-интерфейсы (SAX и StAX), интерфейсы привязки объектов данных (JAXB) и высокоуровневые декларативные языки (XSLT, XQuery, XPath). Это лучше всего зависит от ваших требований к проекту и вашего личного вкуса.
VTD-XML - это мощная библиотека синтаксического анализа XML... она лучше других практически во всех отношениях... вот документ в 2013 году, в котором анализируются все платформы обработки XML, доступные в java-платформе...
http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf