一、節點流和處理流的概念
節點流和處理流都是XML文檔的數據流模型,其中節點流是基於文檔模型的處理方式,處理流是基於事件模型的處理方式。
節點流可以看作是一條文檔流水線,它將整個XML文檔解析成為多個節點,每個節點都可以被程序直接處理和修改。
處理流是基於事件驅動的,它將整個XML文檔解析成為多個事件流,程序需要監聽並響應這些事件。
二、節點流和處理流的工作方式
節點流在處理XML文檔時,會將整個文檔解析成為一個文檔節點,然後將每個元素、屬性、文本和注釋節點依次解析出來,並生成對應的DOM對象。程序可以直接對DOM對象進行增刪改查等操作,最終將修改後的DOM對象重新序列化為XML文檔。
處理流則是在解析XML文檔時,程序需要註冊事件處理器,監聽事件流的變化,並對特定的事件響應不同的處理程序。例如,程序可以監聽元素節點的開始標籤和結束標籤事件,在開始標籤事件中生成元素節點對象,在結束標籤事件中將元素節點對象添加到DOM樹上。
三、節點流和處理流的優缺點
節點流的優點在於它為程序提供了完整的DOM樹,程序可以直接對DOM進行增刪改查等操作,非常方便。缺點在於,節點流在處理大型XML文檔時可能會帶來性能瓶頸,因為需要解析整個文檔,生成完整的DOM樹。
處理流的優點在於它可以在解析XML文檔的同時實現事件處理,程序可以在不需要完整DOM樹的情況下對XML文檔進行處理,因此可以用於處理大型XML文檔,提高性能。缺點在於處理流相對節點流來說,對於一些複雜操作可能不太方便,例如在事件處理過程中需要訪問DOM樹。
四、節點流和處理流的代碼示例
節點流的代碼示例:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class DOMParserExample { public static void main(String[] args) { try { File inputFile = new File("input.xml"); 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 i = 0; i < nList.getLength(); i++) { Node nNode = nList.item(i); 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()); System.out.println("Nickname : " + eElement.getElementsByTagName("nickname").item(0).getTextContent()); System.out.println("Marks : " + eElement.getElementsByTagName("marks").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
處理流的代碼示例:
import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; public class SAXExample extends DefaultHandler { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; boolean bMarks = false; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("student")) { String rollNo = attributes.getValue("rollno"); System.out.println("Roll No : " + rollNo); } else if (qName.equalsIgnoreCase("firstname")) { bFirstName = true; } else if (qName.equalsIgnoreCase("lastname")) { bLastName = true; } else if (qName.equalsIgnoreCase("nickname")) { bNickName = true; } else if (qName.equalsIgnoreCase("marks")) { bMarks = true; } } public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("student")) { System.out.println("End Element : " + qName); } } public void characters(char ch[], int start, int length) throws SAXException { if (bFirstName) { System.out.println("First Name : " + new String(ch, start, length)); bFirstName = false; } else if (bLastName) { System.out.println("Last Name : " + new String(ch, start, length)); bLastName = false; } else if (bNickName) { System.out.println("Nick Name : " + new String(ch, start, length)); bNickName = false; } else if (bMarks) { System.out.println("Marks : " + new String(ch, start, length)); bMarks = false; } } public static void main(String[] args) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); SAXExample userhandler = new SAXExample(); saxParser.parse("input.xml", userhandler); } catch (Exception e) { e.printStackTrace(); } } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/158341.html