Разбор массива элементов в xml с помощью java

Здесь я использую метод SAX для разбора массива. Я столкнулся с проблемой, когда я не могу написать общий код для анализа типа массива xml. Я не мог найти решение для методологии общего способа, чтобы идентифицировать его как массив, перебирать его и сохранять в списке.

<bookstore>
  <book category = "children">
    <title>Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category = "web">
    <title>Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

Любое решение поможет. заранее спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
864
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я использую код ниже. Я получил это от: https://github.com/niteshapte/generic-xml-parser

public class GenericXMLParserSAX extends DefaultHandler {

    private ListMultimap<String, String> listMultimap = ArrayListMultimap.create();
    String tempCharacter;   
    private String[] startElements;
    private String[] endElements;

    public void setStartElements(String[] startElements) {
            this.startElements = startElements;
    }

    public String[] getStartElements() {
            return startElements;
    }

    public void setEndElements(String[] endElements) {
            this.endElements = endElements;
    }

    public String[] getEndElements() {
            return endElements;
    }

    public void parseDocument(String xml, String[] startElements, String[] endElements) {
            setStartElements(startElements);
            setEndElements(endElements);

            SAXParserFactory spf = SAXParserFactory.newInstance();
            try {
                    SAXParser sp = spf.newSAXParser();                      
                    InputStream inputStream = new ByteArrayInputStream(xml.getBytes());                     
                    sp.parse(inputStream, this);
            } catch(SAXException se) {
                    se.printStackTrace();
            } catch(ParserConfigurationException pce) {
                    pce.printStackTrace();
            } catch (IOException ie) {
                    ie.printStackTrace();
            }
    }

    public void parseDocument(String xml, String[] endElements) {           
            setEndElements(endElements);

            SAXParserFactory spf = SAXParserFactory.newInstance();
            try {
                    SAXParser sp = spf.newSAXParser();                      
                    InputStream inputStream = new ByteArrayInputStream(xml.getBytes());                     
                    sp.parse(inputStream, this);
            } catch(SAXException se) {
                    se.printStackTrace();
            } catch(ParserConfigurationException pce) {
                    pce.printStackTrace();
            } catch (IOException ie) {
                    ie.printStackTrace();
            }
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            String[] startElements = getStartElements();

            if (startElements!= null){
                    for(int i = 0; i < startElements.length; i++) {
                            if (qName.startsWith(startElements[i])) {                                
                                    listMultimap.put(startElements[i], qName);
                            }
                    }       
            }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
            tempCharacter = new String(ch, start, length);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {                
            String[] endElements = getEndElements();

            for(int i = 0; i < endElements.length; i++) {
                    if (qName.equalsIgnoreCase(endElements[i])) {
                            listMultimap.put(endElements[i], tempCharacter);                
                    }
            }
    }

    public ListMultimap<String, String> multiSetResult() {            
            return listMultimap;
    }
}

Вы можете создать собственный обработчик, который расширяет Обработчик по умолчанию, и использовать его для анализа вашего XML и создания List<Book> для вас.

Обработчик будет поддерживать List<Book> и:

  • каждый раз, когда он будет встречать тег book Начало, он будет создавать новый Book
  • каждый раз, когда он будет встречать тег книги конец, он будет добавлять этот Book в список.

В конце концов, он будет содержать полный список книг, и вы сможете получить к нему доступ с помощью метода getBooks().

Предполагая, что этот класс Book:

class Book {
    private String category;
    private String title;
    private String author;
    private String year;
    private String price;
    // GETTERS/SETTERS
}

Вы можете создать собственный обработчик следующим образом:

class MyHandler extends DefaultHandler {

    private boolean title = false;
    private boolean author = false;
    private boolean year = false;
    private boolean price = false;

    // Holds the list of Books
    private List<Book> books = new ArrayList<>();
    // Holds the Book we are currently parsing
    private Book book;

    public void startElement(String uri, String localName,String qName, Attributes attributes) {

        switch (qName) {
            // Create a new Book when finding the start book tag
            case "book": {
                book = new Book();
                book.setCategory(attributes.getValue("category"));
            }
            case "title": title = true;
            case "author": author = true;
            case "year": year = true;
            case "price": price = true;
        }
    }

    public void endElement(String uri, String localName, String qName) {
        // Add the current Book to the list when finding the end book tag
        if ("book".equals(qName)) {
            books.add(book);
        }
    }

    public void characters(char[] ch, int start, int length) {
        String value = new String(ch, start, length);

        if (title) {
            book.setTitle(value);
            title = false;
        } else if (author) {
            book.setAuthor(value);
            author = false;
        } else if (year) {
            book.setYear(value);
            year = false;
        } else if (price) {
            book.setPrice(value);
            price = false;
        }
    }

    public List<Book> getBooks() {
        return books;
    }
}

Затем вы выполняете синтаксический анализ с помощью этого пользовательского обработчика и получаете список книг.

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();

MyHandler myHandler = new MyHandler();
saxParser.parse("/path/to/file.xml", myHandler);
List<Book> books = myHandler.getBooks();

Другие вопросы по теме