c语言编程笔录

首页 >   > 笔记大全

笔记大全

java读取解析xml文件实例

更新时间:2023-11-26

XML文件格式介绍

在进行java读取解析XML文件之前,我们首先需要了解XML的文件格式和结构,确保我们能够准确地解析和处理XML文件。XML标签通常包含在一对尖括号中(类似于HTML),每个标签的名称和值由名称-值对表示。XML文件包含声明头(以 <?xml ?>开头),然后是文档根元素,它是XML文档中的第一个元素。

    <?xml version="1.0" encoding="UTF-8" ?>
    
      
        John Doe
        A Java Tutorial
        Wiley
        3
        978-0470105554
      
      
        John Smith
        Another Java Tutorial
        McGraw Hill
        2
        978-0072253609
      
    

使用DOM解析XML文件

我们可以使用Java内置的DOM类库来解析XML文件。DOM解析器会将整个XML文件加载到内存中,并将其表示为一个树形结构。我们可以遍历树来获取XML文件中的信息。下面是一个示例代码,它使用DOM解析器解析XML文件:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    
    // Load and parse XML file
    Document document = builder.parse(new File("catalog.xml"));
    
    // Get the document root element
    Element rootElement = document.getDocumentElement();
    
    // Get a list of all book elements
    NodeList bookNodes = rootElement.getElementsByTagName("book");
    
    // Iterate over book elements and print the author and title
    for (int i = 0; i < bookNodes.getLength(); i++) {
        Element bookElement = (Element) bookNodes.item(i);
        String author = bookElement.getElementsByTagName("author").item(0).getTextContent();
        String title = bookElement.getElementsByTagName("title").item(0).getTextContent();
        System.out.println("Book " + (i + 1) + ": " + author + " - " + title);
    }

使用SAX解析XML文件

SAX解析器与DOM解析器不同,它采用事件驱动的方式读取XML文件并触发事件。这种方式可以节省内存,并且对于大型XML文件非常有用,因为它不会一次性读取整个文件。下面是一个示例代码,它使用SAX解析器解析XML文件:

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    
    DefaultHandler handler = new DefaultHandler() {
        boolean inAuthor = false;
        boolean inTitle = false;
        StringBuilder authorBuilder = new StringBuilder();
        StringBuilder titleBuilder = new StringBuilder();
        
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            if (qName.equalsIgnoreCase("author")) {
                inAuthor = true;
            } else if (qName.equalsIgnoreCase("title")) {
                inTitle = true;
            }
        }
        
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (qName.equalsIgnoreCase("author")) {
                inAuthor = false;
            } else if (qName.equalsIgnoreCase("title")) {
                inTitle = false;
            }
            
            if (qName.equalsIgnoreCase("book")) {
                System.out.println("Book: " + authorBuilder.toString() + " - " + titleBuilder.toString());
                authorBuilder.setLength(0);
                titleBuilder.setLength(0);
            }
        }
        
        public void characters(char[] ch, int start, int length) throws SAXException {
            if (inAuthor) {
                authorBuilder.append(new String(ch, start, length));
            } else if (inTitle) {
                titleBuilder.append(new String(ch, start, length));
            }
        }
    };
    
    // Parse XML file
    parser.parse(new File("catalog.xml"), handler);

使用JAXB解析XML文件

JAXB是Java Architecture for XML Binding的缩写,它是Java EE的一部分,提供了将Java类映射到XML文档的功能。JAXB通过生成Java类来实现它,这些类可以自动读入和写出XML文件。下面是一个示例代码,它使用JAXB解析XML文件:

    JAXBContext context = JAXBContext.newInstance(Catalog.class);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    
    // Unmarshal XML file
    Catalog catalog = (Catalog) unmarshaller.unmarshal(new File("catalog.xml"));
    
    // Iterate over books in the catalog
    for (Book book : catalog.getBooks()) {
        System.out.println("Book: " + book.getAuthor() + " - " + book.getTitle());
    }