Какая лучшая библиотека для синтаксического анализа XML в java
Я ищу библиотеку java для синтаксического анализа XML (сложной конфигурации и файлов данных), я немного погуглил, но не смог найти ничего, кроме dom4j (похоже, они работают на версии V2).. Я посмотрел конфигурацию commons, но она мне не понравилась, другие проекты apache по XML, похоже, находятся в спящем режиме. Я не оценивал dom4j самостоятельно, но просто хотел узнать - есть ли в java другие (хорошие) библиотеки синтаксического анализа xml с открытым исходным кодом? и каков ваш опыт работы с dom4j?
После ответа @ Voo's позвольте мне задать еще один вопрос - должен ли я использовать встроенные классы Java или любую стороннюю библиотеку, такую как dom4j.. В чем преимущества?
Переведено автоматически
Ответ 1
На самом деле Java поддерживает 4 метода для готового синтаксического анализа XML:
DOM-анализатор / конструктор: вся структура 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: исключительно для чтения 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 мне следует использовать?". Ну, это зависит - не все API обладают такими же возможностями, как вы видите, но если у вас есть контроль над классами, которые вы используете для отображения XML-документа, JAXB - мое личное любимое, действительно элегантное и простое решение (хотя я не использовал его для действительно больших документов, это может стать немного сложным). SAX тоже довольно прост в использовании, и просто держитесь подальше от DOM, если у вас нет действительно веской причины использовать его - на мой взгляд, старый, неуклюжий API. Я не думаю, что существуют какие-либо современные сторонние библиотеки, в которых есть что-то особенно полезное, чего нет в STL, а стандартные библиотеки обладают обычными преимуществами: они чрезвычайно хорошо протестированы, документированы и стабильны.
Ответ 2
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 /
Ответ 3
Если вам нужен DOM-подобный API, то есть такой, в котором анализатор XML превращает документ в дерево элементов и узлов атрибутов, тогда есть как минимум четыре варианта на выбор: сам DOM, JDOM, DOM4J и XOM. Единственная возможная причина использования DOM заключается в том, что он воспринимается как стандарт и поставляется в JDK: во всех остальных отношениях все остальные превосходят. Я лично предпочитаю XOM из-за сочетания простоты, мощности и производительности.
И, конечно, существуют другие стили обработки: низкоуровневые интерфейсы синтаксического анализа (SAX и StAX), интерфейсы привязки данных к объектам (JAXB) и декларативные языки высокого уровня (XSLT, XQuery, XPath). Что лучше для вас, зависит от требований вашего проекта и вашего личного вкуса.
Ответ 4
Точка зрения Никиты превосходна: не путайте mature с bad. XML не сильно изменился.
JDOM станет еще одной альтернативой DOM4J.