<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 SAX 教程 原文:http://zetcode.com/java/sax/ Java SAX 教程展示了如何使用 Java SAX API 來讀取和驗證 XML 文檔。 ## SAX SAX(XML 的簡單 API)是事件驅動的算法,用于解析 XML 文檔。 SAX 是文檔對象模型(DOM)的替代方法。 在 DOM 讀取整個文檔以對 XML 進行操作的地方,SAX 解析器逐個節點讀取 XML,發出解析事件,同時逐步遍歷輸入流。 SAX 獨立于狀態處理文檔(元素的處理不依賴于之前的元素)。 SAX 解析器是只讀的。 SAX 解析器更快并且需要更少的內存。 另一方面,DOM 更易于使用,并且有些任務(例如,排序元素,重新排列元素或查找元素)使用 DOM 更快。 SADK 解析器是 JDK 附帶的,因此不需要下載依賴項。 ## Java SAX 解析示例 在下面的示例中,我們使用 SAX 解析器讀取 XML 文件。 ```java <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <configuration> <mainClass>com.zetcode.JavaReadXmlSaxEx</mainClass> </configuration> </plugin> </plugins> </build> ``` 我們使用`exec-maven-plugin`從 Maven 執行 Java 主類。 `users.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <users> <user id="1"> <firstname>Peter</firstname> <lastname>Brown</lastname> <occupation>programmer</occupation> </user> <user id="2"> <firstname>Martin</firstname> <lastname>Smith</lastname> <occupation>accountant</occupation> </user> <user id="3"> <firstname>Lucy</firstname> <lastname>Gordon</lastname> <occupation>teacher</occupation> </user> </users> ``` 我們將閱讀此 XML 文件。 `User.java` ```java package com.zetcode; public class User { int id; private String firstName; private String lastName; private String occupation; public User() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getOccupation() { return occupation; } public void setOccupation(String occupation) { this.occupation = occupation; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("User{").append("id=").append(id) .append(", firstName=").append(firstName) .append(", lastName=").append(lastName) .append(", occupation=").append(occupation).append("}"); return builder.toString(); } } ``` 這是用戶 bean。 它將保存來自 XML 節點的數據。 `MyRunner.java` ```java package com.zetcode; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class MyRunner { private SAXParser createSaxParser() { SAXParser saxParser = null; try { SAXParserFactory factory = SAXParserFactory.newInstance(); saxParser = factory.newSAXParser(); return saxParser; } catch (ParserConfigurationException | SAXException ex) { Logger lgr = Logger.getLogger(MyRunner.class.getName()); lgr.log(Level.SEVERE, ex.getMessage(), ex); } return saxParser; } public List<User> parseUsers() { MyHandler handler = new MyHandler(); String fileName = "src/main/resources/users.xml"; File xmlDocument = Paths.get(fileName).toFile(); try { SAXParser parser = createSaxParser(); parser.parse(xmlDocument, handler); } catch (SAXException | IOException ex) { Logger lgr = Logger.getLogger(MyRunner.class.getName()); lgr.log(Level.SEVERE, ex.getMessage(), ex); } return handler.getUsers(); } } ``` `MyRunner`創建一個 SAX 解析器并啟動解析。 `parseUsers`返回`User`對象列表中的解析數據。 ```java SAXParserFactory factory = SAXParserFactory.newInstance(); saxParser = factory.newSAXParser(); ``` 從`SAXParserFactory`獲得`SAXParser`。 ```java SAXParser parser = createSaxParser(); parser.parse(xmlDocument, handler); ``` 我們使用`parse()`方法解析文檔。 方法的第二個參數是處理器對象,其中包含事件處理器。 `MyHandler.java` ```java package com.zetcode; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyHandler extends DefaultHandler { private List<User> users = new ArrayList<>(); private User user; private boolean bfn = false; private boolean bln = false; private boolean boc = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("user".equals(qName)) { user = new User(); int id = Integer.valueOf(attributes.getValue("id")); user.setId(id); } switch (qName) { case "firstname": bfn = true; break; case "lastname": bln = true; break; case "occupation": boc = true; break; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (bfn) { user.setFirstName(new String(ch, start, length)); bfn = false; } if (bln) { user.setLastName(new String(ch, start, length)); bln = false; } if (boc) { user.setOccupation(new String(ch, start, length)); boc = false; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("user".equals(qName)) { users.add(user); } } public List<User> getUsers() { return users; } } ``` 在`MyHandler`類中,我們具有事件處理器的實現。 ```java public class MyHandler extends DefaultHandler { ``` 處理器類必須從具有事件方法的`DefaultHandler`擴展。 ```java @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("user".equals(qName)) { user = new User(); int id = Integer.valueOf(attributes.getValue("id")); user.setId(id); } switch (qName) { case "firstname": bfn = true; break; case "lastname": bln = true; break; case "occupation": boc = true; break; } } ``` 當解析器開始解析新元素時,將調用`startElement()`方法。 如果元素為`<user>`,我們將創建一個新用戶。 對于其他類型的元素,我們設置布爾值。 ```java @Override public void characters(char[] ch, int start, int length) throws SAXException { if (bfn) { user.setFirstName(new String(ch, start, length)); bfn = false; } if (bln) { user.setLastName(new String(ch, start, length)); bln = false; } if (boc) { user.setOccupation(new String(ch, start, length)); boc = false; } } ``` 當解析器在元素內部遇到文本時,將調用`characters()`方法。 根據布爾變量,我們設置用戶屬性。 ```java @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("user".equals(qName)) { users.add(user); } } ``` 在`<user>`元素的末尾,我們將用戶對象添加到用戶列表中。 `JavaReadXmlSaxEx.java` ```java package com.zetcode; import java.util.List; public class JavaReadXmlSaxEx { public static void main(String[] args) { MyRunner runner = new MyRunner(); List<User> lines = runner.parseUsers(); lines.forEach(System.out::println); } } ``` `JavaReadXmlSaxEx`啟動應用。 它將解析任務委托給`MyRunner`。 最后,檢索到的數據將打印到控制臺。 ```java $ mvn exec:java -q User{id=1, firstName=Peter, lastName=Brown, occupation=programmer} User{id=2, firstName=Martin, lastName=Smith, occupation=accountant} User{id=3, firstName=Lucy, lastName=Gordon, occupation=teacher} ``` 這是示例的輸出。 ## Java SAX 驗證示例 以下示例使用 XSD 語言來驗證 XML 文件。 XSD(XML 架構定義)是所有 XML 文檔和數據的當前標準架構語言。 (還有其他替代的模式語言,例如 DTD 和 RELAX NG。)XSD 是 XML 文檔必須遵循的一組規則,以便根據該模式被視為有效。 `users.xsd` ```java <?xml version="1.0"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="users"> <xs:complexType> <xs:sequence> <xs:element name="user" maxOccurs="unbounded" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="firstname"/> <xs:element type="xs:string" name="lastname"/> <xs:element type="xs:string" name="occupation"/> </xs:sequence> <xs:attribute name="id" type="xs:int" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> ``` 這是用于驗證用戶的 XSD 文件。 例如,它聲明`<user>`元素必須在`<users>`元素之內,或者`<user>`的`id`屬性必須是且是整數,并且是強制性的。 `JavaXmlSchemaValidationEx.java` ```java package com.zetcode; import java.io.File; import java.io.IOException; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.XMLConstants; import javax.xml.transform.sax.SAXSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class JavaXmlSchemaValidationEx { public static void main(String[] args) { File xsdFile = new File("src/main/resources/users.xsd"); try { Path xmlPath = Paths.get("src/main/resources/users.xml"); Reader reader = Files.newBufferedReader(xmlPath); String schemaLang = XMLConstants.W3C_XML_SCHEMA_NS_URI; SchemaFactory factory = SchemaFactory.newInstance(schemaLang); Schema schema = factory.newSchema(xsdFile); Validator validator = schema.newValidator(); SAXSource source = new SAXSource(new InputSource(reader)); validator.validate(source); System.out.println("The document was validated OK"); } catch (SAXException ex) { Logger lgr = Logger.getLogger(JavaXmlSchemaValidationEx.class.getName()); lgr.log(Level.SEVERE, "The document failed to validate"); lgr.log(Level.SEVERE, ex.getMessage(), ex); } catch (IOException ex) { Logger lgr = Logger.getLogger(JavaXmlSchemaValidationEx.class.getName()); lgr.log(Level.SEVERE, ex.getMessage(), ex); } } } ``` 該示例使用`users.xsd`模式來驗證`users.xml`文件。 ```java String schemaLang = XMLConstants.W3C_XML_SCHEMA_NS_URI; SchemaFactory factory = SchemaFactory.newInstance(schemaLang); Schema schema = factory.newSchema(xsdFile); ``` 使用`SchemaFactory`,我們為我們的模式定義選擇 W3C XML 模式。 換句話說,我們的自定義架構定義還必須遵守某些規則。 ```java Validator validator = schema.newValidator(); ``` 從架構生成一個新的驗證器。 ```java SAXSource source = new SAXSource(new InputSource(reader)); validator.validate(source); ``` 我們根據提供的模式驗證 XML 文檔。 ```java } catch (SAXException ex) { Logger lgr = Logger.getLogger(JavaXmlSchemaValidationEx.class.getName()); lgr.log(Level.SEVERE, "The document failed to validate"); lgr.log(Level.SEVERE, ex.getMessage(), ex); } ``` 默認情況下,如果文檔無效,則拋出`SAXException`。 在本教程中,我們已使用 Java SAX 閱讀并驗證了 XML 文檔。 您可能也對相關教程感興趣: [Java DOM 教程](/java/dom/), [Java JAXB 教程](/java/jaxb/), [Java JSON 處理教程](/java/jsonp/),[提供 XML 的 Java Servlet](/articles/javaservletservexml/) 和 [Java 教程](/lang/java/)。
                  <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>

                              哎呀哎呀视频在线观看