【问题标题】:parsing an array of elements in xml using java使用java解析xml中的元素数组
【发布时间】:2019-05-30 10:34:48
【问题描述】:

在这里,我使用 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>

任何解决方案都会有所帮助。提前致谢

【问题讨论】:

    标签: java xml spring sax


    【解决方案1】:

    我使用下面的代码。我来自: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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建一个扩展 DefaultHandler 的自定义处理程序,并使用它来解析您的 XML 并为您生成 List&lt;Book&gt;

      处理程序将维护一个List&lt;Book&gt; 并且:

      • 每次遇到书的开始标签,都会创建一个新的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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 2013-09-17
        相关资源
        最近更新 更多