Java自带的工具包java.xml提供了多种方法如:DOM解析、SAX解析和StAX解析,这三种经典的方式。
一、DOM解析
DOM分析是在内存中读取XML文件,形成“对象树”,每一个元素、属性、文字等都会成为一个节点,然后可以随意添加、删除和检查这些节点。
此外,DOM分析还可以支持XML文档中的任何复杂级操作,包括修改XML内容和结构。但如果XML文件过大,DOM分析就会占用大量的内存。
importjavax.xml.parsers.DocumentBuilderFactory; importjavax.xml.parsers.DocumentBuilder; importorg.w3c.dom.Document; importorg.w3c.dom.NodeList; importorg.w3c.dom.Node; importorg.w3c.dom.Element; importjava.io.File; try{ FileinputFile=newFile("input.txt"); DocumentBuilderFactorydbFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderdBuilder=dbFactory.newDocumentBuilder(); Documentdoc=dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); System.out.println("Rootelement:"+doc.getDocumentElement().getNodeName()); NodeListnList=doc.getElementsByTagName("student"); System.out.println("----------------------------"); for(inttemp=0;temp<nList.getLength();temp++){ NodenNode=nList.item(temp); System.out.println("\nCurrentElement:"+nNode.getNodeName()); if(nNode.getNodeType()==Node.ELEMENT_NODE){ ElementeElement=(Element)nNode; System.out.println("Studentrollno:"+eElement.getAttribute("rollno")); System.out.println("FirstName:"+eElement.getElementsByTagName("firstname").item(0).getTextContent()); System.out.println("LastName:"+eElement.getElementsByTagName("lastname").item(0).getTextContent()); } } }catch(Exceptione){ e.printStackTrace(); }
二、SAX解析
SAX分析是一种基于事件的分析方法,不需要将XML文件加载到内存中。而是一边扫描一边分析,适合大型文件的分析。
但SAX分析只能进行只读操作,不支持写入操作。另外,它不保存XML文档的状态,一旦开始分析,就无法追溯。
importorg.xml.sax.Attributes; importorg.xml.sax.SAXException; importorg.xml.sax.helpers.DefaultHandler; importjavax.xml.parsers.ParserConfigurationException; importjavax.xml.parsers.SAXParser; importjavax.xml.parsers.SAXParserFactory; importjava.io.IOException; publicclassReadXMLFile{ publicstaticvoidmain(Stringargv[]){ try{ SAXParserFactoryfactory=SAXParserFactory.newInstance(); SAXParsersaxParser=factory.newSAXParser(); DefaultHandlerhandler=newDefaultHandler(){ booleanbfname=false; booleanbsalary=false; publicvoidstartElement(Stringuri,StringlocalName,StringqName, Attributesattributes)throwsSAXException{ if(qName.equalsIgnoreCase("FIRSTNAME")){ bfname=true; } if(qName.equalsIgnoreCase("SALARY")){ bsalary=true; } } }; saxParser.parse("c:\\file.xml",handler); }catch(ParserConfigurationException|SAXException|IOExceptione){ e.printStackTrace(); } } }
三、StAX解析
StAX提供了一种基于流的XML分析方法,它允许程序员在分析过程中决定分析这些数据,这使得它在处理大量数据时更有效率。
API解析提供了两种API解析。:用于随机访问的CursorAPI,用于处理XML事件的EventIteratorAPI。
importjavax.xml.stream.XMLInputFactory; importjavax.xml.stream.XMLStreamConstants; importjavax.xml.stream.XMLStreamReader; importjava.io.FileNotFoundException; importjava.io.FileReader; publicclassStaxParser{ publicstaticvoidmain(String[]args){ booleanbFirstName=false; booleanbLastName=false; booleanbNickName=false; try{ XMLInputFactoryfactory=XMLInputFactory.newInstance(); XMLStreamReaderreader= factory.createXMLStreamReader(newFileReader("C:\\file.xml")); while(reader.hasNext()){ intevent=reader.next(); switch(event){ caseXMLStreamConstants.START_ELEMENT: if("firstname".equals(reader.getLocalName())){ bFirstName=true; }elseif("lastname".equals(reader.getLocalName())){ bLastName=true; }elseif("nickname".equals(reader.getLocalName())){ bNickName=true; } break; caseXMLStreamConstants.CHARACTERS: if(bFirstName){ System.out.println("FirstName:"+ reader.getText()); bFirstName=false; }elseif(bLastName){ System.out.println("LastName:"+ reader.getText()); bLastName=false; }elseif(bNickName){ System.out.println("NickName:"+ reader.getText()); bNickName=false; } break; caseXMLStreamConstants.END_ELEMENT: break; } } }catch(Exceptione){ e.printStackTrace(); } } }
原创文章,作者:小蓝,如若转载,请注明出处:https://www.beidandianzhu.com/g/1144.html