Java чем парсить xml

Java. Простой SAX парсер

Во многих задачах возникает необходимость использования разного рода xml файлов в различных целях. Я не буду пытаться объять необъятное, а расскажу по своему опыту для чего мне все это понадобилось.

Java, пожалуй, мой самый любимый язык программирования. К тому же эта любовь укрепляется тем, что можно любую задачу и придумывать велосипеда не придется.
Так вот, понадобилось мне создать такую связку клиент-сервер, работающую с БД, которая бы позволяла клиенту удаленно вносить записи в БД сервера. Само собой должны быть проверки вводимых данных и т.д. и т.п., но речь не об этом.
В качестве принципа работы я, не долго думая, избрал передачу информации в виде xml файла. Вида следующего:

* This source code was highlighted with Source Code Highlighter .

Чтобы проще было читать дальше, скажу лишь что это информация о врачах учреждений. Фамилия, имя, отчество, уникальных id, и так далее. Вобщем ряд данных. Далее этот файл благополучно попадал на серверную сторону, и тут начинался разбор файла.
Из двух вариантов разбора(SAX vs DOM) я выбрал SAX ввиду того, что он пошустрее работает, и он первым мне попался в руки 🙂
Итак. Как известно, для успешной работы с парсером нам необходимо переопределить нужные нам методы DefaultHandler’а. Для начала подключим необходимые пакеты.

import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.*;

* This source code was highlighted with Source Code Highlighter .

Теперь можно начать писать наш парсер

public class SAXPars extends DefaultHandler .
>

* This source code was highlighted with Source Code Highlighter .

Начнем с метода startDocument(). Он, как понятно из названия, реагирует на событие начала документа. Сюда можно повесить различные действия по выделению памяти например или по сбросу значений, но наш пример довольно прост, поэтому просто обозначим начало работы соотвествующим сообщением:

@Override
public void startDocument() throws SAXException System. out .println( «Start parse XML. » );
>

* This source code was highlighted with Source Code Highlighter .

Далее. Парсер идет по документу, встречает элемент его структуры. Начинает работать метод startElement(). Причем на самом деле вид его такой: startElement(String namespaceURI, String localName, String qName, Attributes atts). Здесь namespaceURI — это пространство имен, localName — локальное имя элемента, qName- это комбинация локального имени с пространством имен (разделяется двоеточием) и atts — атрибуты данного элемента. В нашем случае все просто. Достаточно воспользоваться qName’ом и кинуть его в некоторую служебную строку thisElement. Тем самым мы помечаем в каком элементе в данный момент мы находимся.

@Override
public void startElement( String namespaceURI, String localName, String qName, Attributes atts) throws SAXException thisElement = qName;
>

* This source code was highlighted with Source Code Highlighter .

Далее, встретив элемент мы доходим до его значения. Здесь включается метод characters(). Он имеет вид: characters(char[] ch, int start, int length). Ну тут все понятно. ch — это массив содержащий собственной саму строку-значение внутри данного элемента. start и length — служебные числа обозначающие точку старта в строке и длину.

@Override
public void characters( char [] ch, int start, int length) throws SAXException if (thisElement.equals( «id» )) doc.setId( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «fam» )) doc.setFam( new String (ch, start, length));
>
if (thisElement.equals( «name» )) doc.setName( new String (ch, start, length));
>
if (thisElement.equals( «otc» )) doc.setOtc( new String (ch, start, length));
>
if (thisElement.equals( «dateb» )) doc.setDateb( new String (ch, start, length));
>
if (thisElement.equals( «datep» )) doc.setDatep( new String (ch, start, length));
>
if (thisElement.equals( «datev» )) doc.setDatev( new String (ch, start, length));
>
if (thisElement.equals( «datebegin» )) doc.setDatebegin( new String (ch, start, length));
>
if (thisElement.equals( «dateend» )) doc.setDateend( new String (ch, start, length));
>
if (thisElement.equals( «vdolid» )) doc.setVdolid( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «specid» )) doc.setSpecid( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «klavid» )) doc.setKlavid( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «stav» )) doc.setStav( new Float( new String (ch, start, length)));
>
if (thisElement.equals( «progid» )) doc.setProgid( new Integer( new String (ch, start, length)));
>
>

* This source code was highlighted with Source Code Highlighter .

Ах, да. Чуть не забыл. В качестве объекта куда буду скидываться напарсенные данные выступает объект типа Doctors. Этот класс определен и имеет все необходимые сеттеры-геттеры.
Далее очевидно элемент заканчивается и за ним идет следующий. За окончание отвечает endElement(). Она сигнализирует нам что элемент закончился и можно что-нибудь сделать в это время. Так и поступим. Очистим Element.

@Override
public void endElement( String namespaceURI, String localName, String qName) throws SAXException thisElement = «» ;
>

* This source code was highlighted with Source Code Highlighter .

Читайте также:  Javascript on esc press

Пройдя таким образом весь документ, мы придем к концу файла. Сработает endDocument(). В нем мы можем высвободить память, сделать какую-то диагностичесую печать и т.д. В нашем случае просто напишем о том что парсинг заканчивается.

@Override
public void endDocument() System. out .println( «Stop parse XML. » );
>

* This source code was highlighted with Source Code Highlighter .

import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.*;

public class SAXPars extends DefaultHandler

Doctors doc = new Doctors();
String thisElement = «» ;

public Doctors getResult() return doc;
>

@Override
public void startDocument() throws SAXException System. out .println( «Start parse XML. » );
>

@Override
public void startElement( String namespaceURI, String localName, String qName, Attributes atts) throws SAXException thisElement = qName;
>

@Override
public void endElement( String namespaceURI, String localName, String qName) throws SAXException thisElement = «» ;
>

@Override
public void characters( char [] ch, int start, int length) throws SAXException if (thisElement.equals( «id» )) doc.setId( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «fam» )) doc.setFam( new String (ch, start, length));
>
if (thisElement.equals( «name» )) doc.setName( new String (ch, start, length));
>
if (thisElement.equals( «otc» )) doc.setOtc( new String (ch, start, length));
>
if (thisElement.equals( «dateb» )) doc.setDateb( new String (ch, start, length));
>
if (thisElement.equals( «datep» )) doc.setDatep( new String (ch, start, length));
>
if (thisElement.equals( «datev» )) doc.setDatev( new String (ch, start, length));
>
if (thisElement.equals( «datebegin» )) doc.setDatebegin( new String (ch, start, length));
>
if (thisElement.equals( «dateend» )) doc.setDateend( new String (ch, start, length));
>
if (thisElement.equals( «vdolid» )) doc.setVdolid( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «specid» )) doc.setSpecid( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «klavid» )) doc.setKlavid( new Integer( new String (ch, start, length)));
>
if (thisElement.equals( «stav» )) doc.setStav( new Float( new String (ch, start, length)));
>
if (thisElement.equals( «progid» )) doc.setProgid( new Integer( new String (ch, start, length)));
>
>

Читайте также:  How do i center an image in css

@Override
public void endDocument() System. out .println( «Stop parse XML. » );
>
>

* This source code was highlighted with Source Code Highlighter .

Надеюсь топик помог легко представить суть работы SAX парсера.
Не судите строго первую статью:) Надеюсь она была хоть кому-то полезна.

UPD: Чтобы запустить данный парсер, можно воспользоваться таким кодом:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAXPars saxp = new SAXPars();

parser.parse( new File ( «. » ), saxp);

* This source code was highlighted with Source Code Highlighter .

Источник

Java: Парсинг xml [закрыт]

Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Хочу увидеть наиболее простой и компактный алгоритм парсинга xml в java. Любые библиотеки, классы. м?

7 ответов 7

Единого общепринятого средства для парсинга XML в java нет, поэтому перечислю наиболее распространенные парсеры:

DOM (Document Object Model – объектная модель документов) – платформенно-независимый программный интерфейс, позволяющий программам и скриптам управлять содержимым документов HTML и XML, а также изменять их структуру и оформление. Модель DOM не накладывает ограничений на структуру документа. Любой документ известной структуры с помощью DOM может быть представлен в виде дерева узлов, каждый узел которого содержит элемент, атрибут, текстовый, графический или любой другой объект. Узлы связаны между собой отношениями родитель-потомок

SAX (Simple API for XML) — событийно-ориентированное API. способ последовательного чтения/записи XML-файлов.

Обычно SAX-парсеры требуют фиксированного количества памяти для своей работы, но не позволяют изменять содержимое документа. Всё, что делает SAX-парсер, это сообщает вызвавшему приложению о встреченных распознанных элементах XML-разметки или о встреченных ошибках.

JDOM (Java Document Object Model) — это свободная Java-реализация DOM для XML, созданная с учётом особенностей языка и платформы Java. JDOM интегрируется с Document Object Model (DOM) и Simple API for XML (SAX), поддерживает XPath и XSLT. В JDOM используются внешние парсеры для генерации документов. JDOM

Читайте также:  Кружок с крестиком css

StAX — Потоковый API для XML. Представляет собой самый последний стандарт обработки данных XML в языке Java. Как поточный метод, он часто оказывается лучшей альтернативой, чем другие методы, например, DOM и SAX, и в отношении производительности, и в отношении удобства в работе.

Все парсеры имеют свои особенности:

  • по разбору элементов,
  • по возможностям изменениям элементов в документе
  • по алгоритму перехода между элементами (DOM, например, читает документ полностью и лишь после этого приступает к его разбору, a SAX разбирает документ по частям)
  • по наличию алгоритма валидации документов (не все парсеры позволяют проверять документ на правильность и валидность, например по схеме XSD)
  • и многие многие другие особенности.

Все особенности этих парсеров влияют на их производительность, чем больше наворотов парсера тем медленнее он работает.

Иногда нужно разбирать документ полностью, иногда нужно найти все элементы определенного типа, а иногда только один элемент в документе.

Какой парсер выбрать, нужно решать в зависимости от поставленной задачи.

Источник

How can I parse XML using Java?

I want to know how to parse this XML using Java. Such that I can use that data as it is in the same given way for my program. I know of how to parse it but the problem is for each command there might be different number of data blocks. So after parsing I need to use respective datablocks for respective commands. I mean for first command while retriving I should get only one data block value and for 2nd command 3 data blocks and so on. Please let me know any sample code for solving this issue.

12 Answers 12

There are two basic approaches to parsing XML.

  1. A cursor (StAX) or event (SAX) based approach. Much more lightweight but often more verbose. This is particularly good when you only want to grab out small parts or the processing is easy; and
  2. Tree-based approaches (DOM). Typically DOM parsers are built on top of SAX/StAX parsers anyway. They require more processing and typically require you to have an entire document in memory before you can do anything (whereas SAX/StAX can be much more efficient and quicker to respond). But this is useful for «random» access to document parts.

Pick whichever is most appropriate for your circumstances.

Simplest way would be to load the document as a DOM Document

Then get what you need using XPath

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream); NodeList nodeList = XPathAPI.selectNodeList(document, "/sys"); for (int i = 0; i

Check out an xpath tutorial here.

Источник

Оцените статью