Java读取XML
Java自带的工具包java.xml提供了多种方法如:DOM解析、SAX解析和StAX解析,这三种经典的方式。
一、DOM解析
DOM分析是在内存中读取XML文件,形成“对象树”,每一个元素、属性、文字等都会成为一个节点,然后可以随意添加、删除和检查这些节点。
此外,DOM分析还可以支持XML文档中的任何复杂级操作,包括修改XML内容和结构。但如果XML文件过大,DOM分析就会占用大量的内存。
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; try { File inputFile = new File("input.txt"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("student"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Student roll no : " + eElement.getAttribute("rollno")); System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent()); System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); }
二、SAX解析
SAX分析是一种基于事件的分析方法,不需要将XML文件加载到内存中。而是一边扫描一边分析,适合大型文件的分析。
但SAX分析只能进行只读操作,不支持写入操作。另外,它不保存XML文档的状态,一旦开始分析,就无法追溯。
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; public class ReadXMLFile { public static void main(String argv[]) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { boolean bfname = false; boolean bsalary = false; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("FIRSTNAME")) { bfname = true; } if (qName.equalsIgnoreCase("SALARY")) { bsalary = true; } } }; saxParser.parse("c:\file.xml", handler); } catch (ParserConfigurationException | SAXException | IOException e) { e.printStackTrace(); } } }
三、StAX解析
StAX提供了一种基于流的XML分析方法,它允许程序员在分析过程中决定分析这些数据,这使得它在处理大量数据时更有效率。
API解析提供了两种API解析。:用于随机访问的CursorAPI,用于处理XML事件的EventIteratorAPI。
import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.FileNotFoundException; import java.io.FileReader; public class StaxParser { public static void main(String[] args) { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; try { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(new FileReader("C:\file.xml")); while(reader.hasNext()){ int event = reader.next(); switch(event){ case XMLStreamConstants.START_ELEMENT: if ("firstname".equals(reader.getLocalName())){ bFirstName = true; } else if ("lastname".equals(reader.getLocalName())){ bLastName = true; } else if ("nickname".equals(reader.getLocalName())){ bNickName = true; } break; case XMLStreamConstants.CHARACTERS: if(bFirstName){ System.out.println("First Name: " + reader.getText()); bFirstName = false; } else if(bLastName){ System.out.println("Last Name: " + reader.getText()); bLastName = false; } else if(bNickName){ System.out.println("Nick Name: " + reader.getText()); bNickName = false; } break; case XMLStreamConstants.END_ELEMENT: break; } } } catch (Exception e) { e.printStackTrace(); } } }