Разбор массива элементов в XML с использованием Java - PullRequest
0 голосов
/ 30 мая 2019

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

<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>

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

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

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

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

  • каждый раз, когда он встречает тег start книги, он создает новый Book
  • каждый раз, когда он встречает тег end книги, он добавляет этот Book в Список.

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

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

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();
0 голосов
/ 30 мая 2019

Я использую код ниже. Я получил это от: 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;
    }
}
...