<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java DOM 教程 原文:http://zetcode.com/java/dom/ Java DOM 教程展示了如何使用 Java DOM API 讀寫 XML 文檔。 ## DOM 文檔對象模型(DOM)是標準樹結構,其中每個節點都包含來自 XML 結構的組件之一。 元素節點和文本節點是兩種最常見的節點類型。 使用 DOM 函數,我們可以創建節點,刪除節點,更改其內容以及遍歷節點層次結構。 ## Java DOM DOM 是用于 XML 處理(JAXP)的 Java API 的一部分。 Java DOM 解析器遍歷 XML 文件并創建相應的 DOM 對象。 這些 DOM 對象以樹結構鏈接在一起。 解析器將整個 XML 結構讀入內存。 SAX 是 DOM 的替代 JAXP API。 SAX 解析器基于事件; 它們速度更快,所需的內存更少。 另一方面,DOM 更易于使用,并且有些任務(例如,排序元素,重新排列元素或查找元素)使用 DOM 更快。 DOM 解析器是 JDK 附帶的,因此無需下載依賴項。 `DocumentBuilderFactory`使應用可以獲得一個解析器,該解析器從 XML 文檔生成 DOM 對象樹。 `DocumentBuilder`定義用于從 XML 文檔獲取 DOM 文檔實例或創建新 DOM 文檔的 API。 `DocumentTraversal`包含創建迭代器以遍歷節點及其子節點的方法。 `NodeFilter`用于過濾掉節點。 `NodeIterator`用于遍歷一組節點。 `TreeWalker`用于使用由其`whatToShow`標志和文檔過濾器定義的文檔視圖瀏覽文檔樹或子樹。 ## 節點類型 以下是一些重要的節點類型的列表: | 類型 | 描述 | | --- | --- | | `Attr` | 表示`Element`對象中的屬性 | | `CDATASection` | 轉義包含可能被視為標記的字符的文本塊 | | `Comment` | 代表注釋的內容 | | `Document` | 代表整個 HTML 或 XML 文檔 | | `DocumentFragment` | 一個輕量級或最小的`Document`對象,用于表示 XML 文檔中大于單個節點的部分 | | `Element` | 元素節點是 DOM 樹的基本分支; 除文本外,大多數項目都是元素 | | `Node` | 整個 DOM 及其每個元素的主要數據類型 | | `NodeList` | 有序的節點集合 | | `Text` | 表示元素或屬性的文本內容(在 XML 中稱為字符數據) | ## XML 示例文件 我們使用以下 XML 文件: `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> ``` 這是`users.xml`文件。 `continents.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <continents> <europe> <slovakia> <capital> Bratislava </capital> <population> 421000 </population> </slovakia> <hungary> <capital> Budapest </capital> <population> 1759000 </population> </hungary> <poland> <capital> Warsaw </capital> <population> 1735000 </population> </poland> </europe> <asia> <china> <capital> Beijing </capital> <population> 21700000 </population> </china> <vietnam> <capital> Hanoi </capital> <population> 7500000 </population> </vietnam> </asia> </continents> ``` 這是`continents.xml`文件。 ```java <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <configuration> <mainClass>com.zetcode.JavaReadXmlDomEx</mainClass> </configuration> </plugin> </plugins> </build> ``` 這些示例使用`exec-maven-plugin`從 Maven 執行 Java 主類。 ## Java DOM 讀取示例 在下面的示例中,我們使用 DOM 解析器讀取 XML 文件。 `JavaXmlDomReadEx.java` ```java package com.zetcode; 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; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class JavaXmlDomReadEx { public static void main(String argv[]) throws SAXException, IOException, ParserConfigurationException { File xmlFile = new File("src/main/resources/users.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = factory.newDocumentBuilder(); Document doc = dBuilder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("Root element: " + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("user"); 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 elem = (Element) nNode; String uid = elem.getAttribute("id"); Node node1 = elem.getElementsByTagName("firstname").item(0); String fname = node1.getTextContent(); Node node2 = elem.getElementsByTagName("lastname").item(0); String lname = node2.getTextContent(); Node node3 = elem.getElementsByTagName("occupation").item(0); String occup = node3.getTextContent(); System.out.printf("User id: %s%n", uid); System.out.printf("First name: %s%n", fname); System.out.printf("Last name: %s%n", lname); System.out.printf("Occupation: %s%n", occup); } } } } ``` 該示例分析`users.xml`文件。 它利用代碼中的標簽名稱。 例如:`elem.getElementsByTagName("lastname")`。 ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = factory.newDocumentBuilder(); ``` 從`DocumentBuilderFactory`獲得`DocumentBuilder`。 `DocumentBuilder`包含用于從 XML 文檔中獲取 DOM 文檔實例的 API。 ```java Document doc = dBuilder.parse(xmlFile); ``` `parse()`方法將 XML 文件解析為`Document`。 ```java doc.getDocumentElement().normalize(); ``` 規范化文檔有助于生成正確的結果。 ```java System.out.println("Root element:" + doc.getDocumentElement().getNodeName()); ``` 我們得到了文檔的根元素。 ```java NodeList nList = doc.getElementsByTagName("user"); ``` 我們使用`getElementsByTagName()`在文檔中獲得了用戶元素的`NodeList`。 ```java for (int i = 0; i < nList.getLength(); i++) { ``` 我們使用`for`循環遍歷列表。 ```java String uid = elem.getAttribute("id"); ``` 我們通過`getAttribute()`獲得`element`屬性。 ```java Node node1 = elem.getElementsByTagName("firstname").item(0); String fname = node1.getTextContent(); Node node2 = elem.getElementsByTagName("lastname").item(0); String lname = node2.getTextContent(); Node node3 = elem.getElementsByTagName("occupation").item(0); String occup = node3.getTextContent(); ``` 我們獲得用戶元素的三個子元素的文本內容。 ```java System.out.printf("User id: %s%n", uid); System.out.printf("First name: %s%n", fname); System.out.printf("Last name: %s%n", lname); System.out.printf("Occupation: %s%n", occup); ``` 我們將當前用戶的文本打印到控制臺。 ```java $ mvn -q exec:java Root element: users Current Element: user User id: 1 First name: Peter Last name: Brown Occupation: programmer Current Element: user User id: 2 First name: Martin Last name: Smith Occupation: accountant Current Element: user User id: 3 First name: Lucy Last name: Gordon Occupation: teacher ``` 這是輸出。 ## Java DOM 使用`NodeIterator`讀取元素 `DocumentTraversal`包含創建`NodeIterators`和`TreeWalkers`以首先深度遍歷節點及其子節點(預訂購文檔順序)的方法。 此順序等效于開始標記在文檔的文本表示中出現的順序。 `JavaXmlDomReadElements.java` ```java package com.zetcode; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.NodeIterator; import org.xml.sax.SAXException; public class JavaXmlDomReadElements { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder loader = factory.newDocumentBuilder(); Document document = loader.parse("src/main/resources/continents.xml"); DocumentTraversal trav = (DocumentTraversal) document; NodeIterator it = trav.createNodeIterator(document.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true); int c = 1; for (Node node = it.nextNode(); node != null; node = it.nextNode()) { String name = node.getNodeName(); System.out.printf("%d %s%n", c, name); c++; } } } ``` 該示例打印`continents.xml`文件的所有節點元素。 ```java DocumentTraversal trav = (DocumentTraversal) document; ``` 從文檔中,我們得到一個`DocumentTraversal`對象。 ```java NodeIterator it = trav.createNodeIterator(document.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true); ``` 我們創建一個`NodeIterator`。 設置`NodeFilter.SHOW_ELEMENT`時,僅顯示節點元素。 ```java for (Node node = it.nextNode(); node != null; node = it.nextNode()) { String name = node.getNodeName(); System.out.printf("%d %s%n", c, name); c++; } ``` 在`for`循環中,我們遍歷節點并打印其名稱。 ```java $ mvn -q exec:java 1 continents 2 europe 3 slovakia 4 capital 5 population 6 hungary 7 capital 8 population 9 poland 10 capital 11 population 12 asia 13 china 14 capital 15 population 16 vietnam 17 capital 18 population ``` `continents.xml`包含這 18 個元素。 ## Java DOM 使用`NodeIterator`讀取文本 在下面的示例中,我們使用`NodeIterator`讀取文本數據。 `JavaXmlDomReadText.java` ```java package com.zetcode; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.NodeIterator; import org.xml.sax.SAXException; public class JavaXmlDomReadText { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder loader = factory.newDocumentBuilder(); Document document = loader.parse("src/main/resources/continents.xml"); DocumentTraversal traversal = (DocumentTraversal) document; NodeIterator iterator = traversal.createNodeIterator( document.getDocumentElement(), NodeFilter.SHOW_TEXT, null, true); for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { String text = n.getTextContent().trim(); if (!text.isEmpty()) { System.out.println(text); } } } } ``` 該示例從`continents.xml`文件讀取字符數據。 ```java NodeIterator iterator = traversal.createNodeIterator( document.getDocumentElement(), NodeFilter.SHOW_TEXT, null, true); ``` 節點過濾器設置為`NodeFilter.SHOW_TEXT`。 ```java String text = n.getTextContent().trim(); if (!text.isEmpty()) { System.out.println(text); } ``` 我們修剪空白并打印文本(如果不為空)。 ```java $ mvn -q exec:java Bratislava 421000 Budapest 1759000 Warsaw 1735000 Beijing 21700000 Hanoi 7500000 ``` 這是輸出。 ## Java DOM 自定義`NodeFilter` 以下示例使用自定義 DOM 過濾器。 自定義 DOM 過濾器必須實現`NodeFilter`接口。 `JavaXmlCustomFilter.java` ```java package com.zetcode; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.NodeIterator; import org.xml.sax.SAXException; public class JavaXmlCustomFilter { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder loader = factory.newDocumentBuilder(); Document document = loader.parse("src/main/resources/continents.xml"); DocumentTraversal trav = (DocumentTraversal) document; MyFilter filter = new MyFilter(); NodeIterator it = trav.createNodeIterator(document.getDocumentElement(), NodeFilter.SHOW_ELEMENT, filter, true); for (Node node = it.nextNode(); node != null; node = it.nextNode()) { String name = node.getNodeName(); String text = node.getTextContent().trim().replaceAll("\\s+", " "); System.out.printf("%s: %s%n", name, text); } } static class MyFilter implements NodeFilter { @Override public short acceptNode(Node thisNode) { if (thisNode.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) thisNode; String nodeName = e.getNodeName(); if ("slovakia".equals(nodeName) || "poland".equals(nodeName)) { return NodeFilter.FILTER_ACCEPT; } } return NodeFilter.FILTER_REJECT; } } } ``` 該示例僅顯示 XML 文件中的斯洛伐克和波蘭節點。 ```java MyFilter filter = new MyFilter(); NodeIterator it = trav.createNodeIterator(document.getDocumentElement(), NodeFilter.SHOW_ELEMENT, filter, true); ``` 我們創建`MyFilter`并將其設置為`createNodeIterator()`方法。 ```java String text = node.getTextContent().trim().replaceAll("\\s+", " "); ``` 文本內容包含空格和換行符; 因此,我們使用正則表達式刪除了不必要的空格。 ```java static class MyFilter implements NodeFilter { @Override public short acceptNode(Node thisNode) { if (thisNode.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) thisNode; String nodeName = e.getNodeName(); if ("slovakia".equals(nodeName) || "poland".equals(nodeName)) { return NodeFilter.FILTER_ACCEPT; } } return NodeFilter.FILTER_REJECT; } } ``` 在`acceptNode()`方法中,我們通過返回`NodeFilter.FILTER_ACCEPT`和`NodeFilter.FILTER_REJECT`來控制要使用的節點。 ```java $ mvn -q exec:java slovakia: Bratislava 421000 poland: Warsaw 1735000 ``` 這是輸出。 ## Java DOM 使用`TreeWalker`讀取 XML `TreeWalker`比`NodeIterator`具有更多的遍歷方法。 `JavaXmlDomTreeWalkerEx.java` ```java package com.zetcode; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.TreeWalker; import org.xml.sax.SAXException; public class JavaXmlDomTreeWalkerEx { public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder loader = factory.newDocumentBuilder(); Document document = loader.parse("src/main/resources/continents.xml"); DocumentTraversal traversal = (DocumentTraversal) document; TreeWalker walker = traversal.createTreeWalker( document.getDocumentElement(), NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, null, true); traverseLevel(walker, ""); } private static void traverseLevel(TreeWalker walker, String indent) { Node node = walker.getCurrentNode(); if (node.getNodeType() == Node.ELEMENT_NODE) { System.out.println(indent + node.getNodeName()); } if (node.getNodeType() == Node.TEXT_NODE) { String content_trimmed = node.getTextContent().trim(); if (content_trimmed.length() > 0) { System.out.print(indent); System.out.printf("%s%n", content_trimmed); } } for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { traverseLevel(walker, indent + " "); } walker.setCurrentNode(node); } } ``` 該示例使用`TreeWalker`讀取`continents.xml`文件的元素和文本。 ```java TreeWalker walker = traversal.createTreeWalker( document.getDocumentElement(), NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, null, true); ``` 使用`DocumentTraversal`中的`createTreeWalker()`創建了`TreeWalker`。 我們將處理元素和文本節點。 請注意,空文本(例如縮進)也被視為文本。 ```java traverseLevel(walker, ""); ``` 該處理委托給`traverseLevel()`方法,該方法被遞歸調用。 ```java if (node.getNodeType() == Node.ELEMENT_NODE) { System.out.println(indent + node.getNodeName()); } ``` 我們使用縮進來打印元素的名稱。 ```java if (node.getNodeType() == Node.TEXT_NODE) { String content_trimmed = node.getTextContent().trim(); if (content_trimmed.length() > 0) { System.out.print(indent); System.out.printf("%s%n", content_trimmed); } } ``` 我們打印文本數據。 由于我們僅對資本和人口數據感興趣,因此我們跳過所有空字符串。 ```java for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) { traverseLevel(walker, indent + " "); } ``` 在此`for`循環中,我們遞歸地深入到樹的分支中。 ```java walker.setCurrentNode(node); ``` 完成分支處理后,我們將與`setCurrentNode()`進入同一級別,以便我們可以繼續進行另一個樹分支。 ```java $ mvn -q exec:java continents europe slovakia capital Bratislava population 421000 hungary capital Budapest population 1759000 poland capital Warsaw population 1735000 asia china capital Beijing population 21700000 vietnam capital Hanoi population 7500000 ``` 這是輸出。 ## Java DOM 編寫示例 在下面的示例中,我們創建一個 XML 文件。 `JavaXmlDomWrite.java` ```java package com.zetcode; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class JavaXmlDomWrite { public static void main(String[] args) throws ParserConfigurationException, TransformerException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); Element root = doc.createElementNS("zetcode.com", "users"); doc.appendChild(root); root.appendChild(createUser(doc, "1", "Robert", "Brown", "programmer")); root.appendChild(createUser(doc, "2", "Pamela", "Kyle", "writer")); root.appendChild(createUser(doc, "3", "Peter", "Smith", "teacher")); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transf = transformerFactory.newTransformer(); transf.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transf.setOutputProperty(OutputKeys.INDENT, "yes"); transf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(doc); File myFile = new File("src/main/resources/users.xml"); StreamResult console = new StreamResult(System.out); StreamResult file = new StreamResult(myFile); transf.transform(source, console); transf.transform(source, file); } private static Node createUser(Document doc, String id, String firstName, String lastName, String occupation) { Element user = doc.createElement("user"); user.setAttribute("id", id); user.appendChild(createUserElement(doc, "firstname", firstName)); user.appendChild(createUserElement(doc, "lastname", lastName)); user.appendChild(createUserElement(doc, "occupation", occupation)); return user; } private static Node createUserElement(Document doc, String name, String value) { Element node = doc.createElement(name); node.appendChild(doc.createTextNode(value)); return node; } } ``` 該示例在`src/main/resources`目錄中創建一個新的`users.xml`文件。 ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); ``` 從文檔構建器工廠創建一個新的文檔構建器。 ```java Document doc = builder.newDocument(); ``` 在文檔構建器中,我們使用`newDocument()`創建一個新文檔。 ```java Element root = doc.createElementNS("zetcode.com", "users"); doc.appendChild(root); ``` 我們創建一個根元素,并使用`appendChild()`將其添加到文檔中。 ```java root.appendChild(createUser(doc, "1", "Robert", "Brown", "programmer")); root.appendChild(createUser(doc, "2", "Pamela", "Kyle", "writer")); root.appendChild(createUser(doc, "3", "Peter", "Smith", "teacher")); ``` 我們將三個子元素附加到根元素。 ```java TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transf = transformerFactory.newTransformer(); ``` Java DOM 使用`Transformer`生成 XML 文件。 之所以稱為轉換器,是因為它也可以使用 XSLT 語言轉換文檔。 在我們的情況下,我們僅寫入 XML 文件。 ```java transf.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transf.setOutputProperty(OutputKeys.INDENT, "yes"); transf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); ``` 我們設置文檔的編碼和縮進。 ```java DOMSource source = new DOMSource(doc); ``` `DOMSource`保存 DOM 樹。 ```java StreamResult console = new StreamResult(System.out); StreamResult file = new StreamResult(myFile); ``` 我們將要寫入控制臺和文件。 `StreamResult`是轉換結果的持有者。 ```java transf.transform(source, console); transf.transform(source, file); ``` 我們將 XML 源代碼寫入流結果。 ```java private static Node createUser(Document doc, String id, String firstName, String lastName, String occupation) { Element user = doc.createElement("user"); user.setAttribute("id", id); user.appendChild(createUserElement(doc, "firstname", firstName)); user.appendChild(createUserElement(doc, "lastname", lastName)); user.appendChild(createUserElement(doc, "occupation", occupation)); return user; } ``` 使用`createElement()`在`createUser()`方法中創建一個新的用戶元素。 元素的屬性由`setAttribute()`設置。 ```java private static Node createUserElement(Document doc, String name, String value) { Element node = doc.createElement(name); node.appendChild(doc.createTextNode(value)); return node; } ``` 使用`appendChild()`將元素添加到其父級,并使用`createTextNode()`創建文本節點。 在本教程中,我們已使用 Java DOM API 讀寫 XML 文件。 您可能也對相關教程感興趣: [Java SAX 教程](/java/sax/), [Java JAXB 教程](/java/jaxb/), [Java JSON 處理教程](/java/jsonp)和 [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>

                              哎呀哎呀视频在线观看