<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 使用 Java StAX 解析器讀取 XML – 游標和迭代器 API > 原文: [https://howtodoinjava.com/xml/read-xml-stax-parser-cursor-iterator/](https://howtodoinjava.com/xml/read-xml-stax-parser-cursor-iterator/) 學習使用 Java StAX 解析器解析和**讀取 XML 文件**。 StAX(用于 XML 的流 API)提供了兩種解析 XML 的方法,即**基于游標的 API** 和**基于迭代器的 API** 。 ## 1)StAX 解析器 就像 [SAX 解析器](https://howtodoinjava.com/xml/how-to-parse-an-xml-using-sax-parser-and-defaulthandler/)一樣, [StAX API](https://docs.oracle.com/javase/tutorial/jaxp/stax/api.html) 設計用于解析 XML 流。 區別在于: 1. StAX 是“`pull`” API。 SAX 是“`push`” API。 2. StAX 可以進行 XML 讀取和寫入。 SAX 只能讀取 XML。 **StAX 是拉取風格 API** 。 這意味著您必須自己將 StAX 解析器從 XML 文件中的一個項目移動到另一個項目,就像使用標準[`Iterator`](https://howtodoinjava.com/java/collections/how-iterator-works-in-java/)或 JDBC [`ResultSet`](https://howtodoinjava.com/java/jdbc/jdbc-select-query-example/)一樣。 然后,您可以通過 StAX 解析器訪問 XML 文件中遇到的每個此類“項目”的 XML 信息。 #### 游標與迭代器 1. 在讀取 XML 文檔時,迭代器讀取器從其`nextEvent()`調用中返回 XML 事件對象。 此事件提供有關您遇到的 XML 標簽類型(元素,文本,注釋等)的信息。 收到的事件是不可變的,因此您可以傳遞應用以安全地對其進行處理。 ```java XMLEventReader reader = ...; while(reader.hasNext()){ XMLEvent event = reader.nextEvent(); if(event.getEventType() == XMLEvent.START_ELEMENT){ //process data } //... more event types handled here... } ``` 2. 與迭代器不同,游標的工作方式類似于 JDBC 中的`Resultset`。 如果將游標移動到 XML 文檔中的下一個元素。 然后,您可以直接在游標上調用方法以獲得有關當前事件的更多信息。 ```java XMLStreamReader streamReader = ...; while(streamReader.hasNext()){ int eventType = streamReader.next(); if(eventType == XMLStreamReader.START_ELEMENT){ System.out.println(streamReader.getLocalName()); } //... more event types handled here... } ``` ## 2)StAX 迭代器 API 示例 下面給出的 XML 文檔演示**如何使用基于 StAX 迭代器的 API 讀取對象**。 #### XML 文件 ```java <employees> <employee id="101"> <name>Lokesh Gupta</name> <title>Author</title> </employee> <employee id="102"> <name>Brian Lara</name> <title>Cricketer</title> </employee> </employees> ``` #### 使用 StAX 迭代器讀取 XML 要讀取文件,我已按照以下步驟編寫了程序: 1. 創建迭代器并開始接收事件。 2. 一旦獲得打開的`'employee'`標簽,請創建一個新的`Employee`對象。 3. 從員工標簽讀取`id`屬性,并將其設置為當前的`Employee`對象。 4. 循環到下一個開始標簽事件。 這些是`employee`標記內的 XML 元素。 讀取這些標簽內的數據。 將讀取的數據設置為當前的`Employee`對象。 5. 繼續迭代事件。 當找到`'employee'`標簽的結束元素事件時,可以說您已經讀取了當前`employee`的數據,因此將當前`employee`對象添加到`employeeList`集合中。 6. 最后,通過打印`employeeList`驗證讀取的數據。 ```java package com.howtodoinjava.demo.stax; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Characters; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; public class ReadXMLExample { public static void main(String[] args) throws FileNotFoundException, XMLStreamException { File file = new File("employees.xml"); // Instance of the class which helps on reading tags XMLInputFactory factory = XMLInputFactory.newInstance(); // Initializing the handler to access the tags in the XML file XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(file)); //All read employees objects will be added to this list List<Employee> employeeList = new ArrayList<>(); //Create Employee object. It will get all the data using setter methods. //And at last, it will stored in above 'employeeList' Employee employee = null; // Checking the availability of the next tag while (eventReader.hasNext()) { XMLEvent xmlEvent = eventReader.nextEvent(); if (xmlEvent.isStartElement()) { StartElement startElement = xmlEvent.asStartElement(); //As soo as employee tag is opened, create new Employee object if("employee".equalsIgnoreCase(startElement.getName().getLocalPart())) { employee = new Employee(); } //Read all attributes when start tag is being read @SuppressWarnings("unchecked") Iterator<Attribute> iterator = startElement.getAttributes(); while (iterator.hasNext()) { Attribute attribute = iterator.next(); QName name = attribute.getName(); if("id".equalsIgnoreCase(name.getLocalPart())) { employee.setId(Integer.valueOf(attribute.getValue())); } } //Now everytime content tags are found; //Move the iterator and read data switch (startElement.getName().getLocalPart()) { case "name": Characters nameDataEvent = (Characters) eventReader.nextEvent(); employee.setName(nameDataEvent.getData()); break; case "title": Characters titleDataEvent = (Characters) eventReader.nextEvent(); employee.setTitle(titleDataEvent.getData()); break; } } if (xmlEvent.isEndElement()) { EndElement endElement = xmlEvent.asEndElement(); //If employee tag is closed then add the employee object to list; //and be ready to read next employee data if("employee".equalsIgnoreCase(endElement.getName().getLocalPart())) { employeeList.add(employee); } } } System.out.println(employeeList); //Verify read data } } //Output: [Employee [id=101, name=Lokesh Gupta, title=Author], Employee [id=102, name=Brian Lara, title=Cricketer]] ``` ## 3)StAX 游標 API 示例 我將使用基于游標的 API 讀取相同的`employees.xml`文件。 ```java package com.howtodoinjava.demo.stax; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; public class ReadXMLExample { public static void main(String[] args) throws FileNotFoundException, XMLStreamException { //All read employees objects will be added to this list List<Employee> employeeList = new ArrayList<>(); //Create Employee object. It will get all the data using setter methods. //And at last, it will stored in above 'employeeList' Employee employee = null; File file = new File("employees.xml"); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader streamReader = factory.createXMLStreamReader(new FileReader(file)); while(streamReader.hasNext()) { //Move to next event streamReader.next(); //Check if its 'START_ELEMENT' if(streamReader.getEventType() == XMLStreamReader.START_ELEMENT) { //employee tag - opened if(streamReader.getLocalName().equalsIgnoreCase("employee")) { //Create new employee object asap tag is open employee = new Employee(); //Read attributes within employee tag if(streamReader.getAttributeCount() > 0) { String id = streamReader.getAttributeValue(null,"id"); employee.setId(Integer.valueOf(id)); } } //Read name data if(streamReader.getLocalName().equalsIgnoreCase("name")) { employee.setName(streamReader.getElementText()); } //Read title data if(streamReader.getLocalName().equalsIgnoreCase("title")) { employee.setTitle(streamReader.getElementText()); } } //If employee tag is closed then add the employee object to list if(streamReader.getEventType() == XMLStreamReader.END_ELEMENT) { if(streamReader.getLocalName().equalsIgnoreCase("employee")) { employeeList.add(employee); } } } //Verify read data System.out.println(employeeList); } } //Output: [Employee [id=101, name=Lokesh Gupta, title=Author], Employee [id=102, name=Brian Lara, title=Cricketer]] ``` ## 4)總結 因此,在此 **StAX 解析器教程**中,我們學習了以下內容: 1. **什么是基于 XML 流 API 的 StAX 解析器**。 2. **StAX 與 SAX** 解析器之間的差異。 3. 如何通過示例使用 StAX 迭代器 API 來**讀取 XML**。 4. 如何通過示例使用 StAX 游標 API 來**讀取 XML**。 兩種 API 都能夠解析任何類型的 XML 文檔,但是**游標 API 比迭代器 API** 具有更高的內存效率。 因此,如果您的應用需要更好的性能,請考慮使用基于游標的 API。 將我的問題放在評論部分。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看