
- Java XML 教程
- Java XML 首頁
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XML 有用資源
- Java XML - 問答
- Java XML 快速指南
- Java XML - 有用資源
- Java XML - 討論
Java XML 快速指南
Java XML - 概述
什麼是 XML?
XML 是一種簡單的基於文字的語言,旨在以純文字格式儲存和傳輸資料。它代表可擴充套件標記語言 (Extensible Markup Language)。以下是 XML 的一些顯著特徵。
XML 是一種標記語言。
XML 是一種基於標籤的語言,類似於 HTML。
XML 標籤不像 HTML 標籤那樣是預定義的。
您可以定義自己的標籤,這就是為什麼它被稱為可擴充套件語言。
XML 標籤設計為自描述的。
XML 是 W3C 推薦的資料儲存和資料傳輸標準。
示例
<?xml version = "1.0"?> <Class> <Name>First</Name> <Sections> <Section> <Name>A</Name> <Students> <Student>Rohan</Student> <Student>Mohan</Student> <Student>Sohan</Student> <Student>Lalit</Student> <Student>Vinay</Student> </Students> </Section> <Section> <Name>B</Name> <Students> <Student>Robert</Student> <Student>Julie</Student> <Student>Kalie</Student> <Student>Michael</Student> </Students> </Section> </Sections> </Class>
優點
以下是 XML 提供的優點:
技術無關性 - 作為純文字,XML 與技術無關。任何技術都可以將其用於資料儲存和資料傳輸。
人機可讀 - XML 使用簡單的文字格式。它易於人類閱讀和理解。
可擴充套件性 - 在 XML 中,可以非常輕鬆地建立和使用自定義標籤。
允許驗證 - 使用 XSD、DTD,可以輕鬆驗證 XML 結構。
缺點
以下是使用 XML 的缺點:
冗餘語法 - XML 檔案通常包含許多重複的術語。
冗長 - 作為一種冗長的語言,XML 檔案的大小增加了傳輸和儲存成本。
Java XML - 解析器
XML 解析是指遍歷 XML 文件以訪問或修改資料。
什麼是 XML 解析器?
XML 解析器提供了一種訪問或修改 XML 文件中資料的方法。Java 提供了多種解析 XML 文件的選項。以下是常用的幾種解析器型別。
DOM 解析器 - 透過載入文件的完整內容並在記憶體中建立其完整的層次樹來解析 XML 文件。
SAX 解析器 - 基於事件觸發來解析 XML 文件。不會將整個文件載入到記憶體中。
JDOM 解析器 - 以類似於 DOM 解析器的方式解析 XML 文件,但更簡單。
StAX 解析器 - 以類似於 SAX 解析器的方式解析 XML 文件,但更高效。
XPath 解析器 - 基於表示式解析 XML 文件,並廣泛與 XSLT 結合使用。
DOM4J 解析器 - 一個使用 Java 集合框架解析 XML、XPath 和 XSLT 的 Java 庫。它支援 DOM、SAX 和 JAXP。
還有 JAXB 和 XSLT API 可用於以面向物件的方式處理 XML 解析。我們將在本教程後續章節中詳細闡述每個解析器。
Java DOM 解析器 - 概述
文件物件模型 (DOM) 是全球資訊網聯盟 (W3C) 的正式推薦。它定義了一個介面,使程式能夠訪問和更新 XML 文件的樣式、結構和內容。支援 DOM 的 XML 解析器實現了此介面。
何時使用?
您應該在以下情況下使用 DOM 解析器:
您需要了解文件的許多結構資訊。
您需要移動 XML 文件的部分內容(例如,您可能需要對某些元素進行排序)。
您需要多次使用 XML 文件中的資訊。
您將獲得什麼?
當您使用 DOM 解析器解析 XML 文件時,您將獲得一個包含文件所有元素的樹狀結構。DOM 提供了各種函式,您可以使用這些函式來檢查文件的內容和結構。
優點
DOM 是操作文件結構的通用介面。其設計目標之一是,為一個符合 DOM 的解析器編寫的 Java 程式碼應該能夠在任何其他符合 DOM 的解析器上執行,無需進行任何修改。
DOM 介面
DOM 定義了幾個 Java 介面。以下是最常見的介面:
Node - DOM 的基本資料型別。
Element - 您將處理的大多數物件都是 Element。
Attr - 表示元素的屬性。
Text - Element 或 Attr 的實際內容。
Document - 表示整個 XML 文件。Document 物件通常被稱為 DOM 樹。
常見的 DOM 方法
使用 DOM 時,有一些方法您會經常用到:
Document.getDocumentElement() - 返回文件的根元素。
Node.getFirstChild() - 返回給定 Node 的第一個子節點。
Node.getLastChild() - 返回給定 Node 的最後一個子節點。
Node.getNextSibling() - 這些方法返回給定 Node 的下一個同級節點。
Node.getPreviousSibling() - 這些方法返回給定 Node 的上一個同級節點。
Node.getAttribute(attrName) - 對於給定的 Node,它返回具有請求名稱的屬性。
Java DOM 解析器 - 解析 XML 文件
使用 JDOM 的步驟
以下是使用 JDOM 解析器解析文件時使用的步驟。
- 匯入 XML 相關的包。
- 建立一個 DocumentBuilder
- 從檔案或流建立文件
- 提取根元素
- 檢查屬性
- 檢查子元素
匯入 XML 相關的包
import org.w3c.dom.*; import javax.xml.parsers.*; import java.io.*;
建立一個 DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();
從檔案或流建立文件
StringBuilder xmlStringBuilder = new StringBuilder(); xmlStringBuilder.append("<?xml version="1.0"?>"); ByteArrayInputStream input = new ByteArrayInputStream( xmlStringBuilder.toString().getBytes("UTF-8")); Document doc = builder.parse(input);
提取根元素
Element root = document.getDocumentElement();
檢查屬性
//returns specific attribute getAttribute("attributeName"); //returns a Map (table) of names/values getAttributes();
檢查子元素
//returns a list of subelements of specified name getElementsByTagName("subelementName"); //returns a list of all child nodes getChildNodes();
演示示例
這是我們需要解析的輸入 xml 檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DomParserDemo.java
package com.tutorialspoint.xml; import java.io.File; 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; public class DomParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); 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 temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); 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("Nick Name : " + eElement .getElementsByTagName("nickname") .item(0) .getTextContent()); System.out.println("Marks : " + eElement .getElementsByTagName("marks") .item(0) .getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
這將產生以下結果:
Root element :class ---------------------------- Current Element :student Student roll no : 393 First Name : dinkar Last Name : kad Nick Name : dinkar Marks : 85 Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95 Current Element :student Student roll no : 593 First Name : jasvir Last Name : singn Nick Name : jazz Marks : 90
Java DOM 解析器 - 查詢 XML 文件
演示示例
這是我們需要查詢的輸入 xml 檔案:
<?xml version = "1.0"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferarri 101</carname> <carname type = "sports car">Ferarri 201</carname> <carname type = "sports car">Ferarri 301</carname> </supercars> <supercars company = "Lamborgini"> <carname>Lamborgini 001</carname> <carname>Lamborgini 002</carname> <carname>Lamborgini 003</carname> </supercars> <luxurycars company = "Benteley"> <carname>Benteley 1</carname> <carname>Benteley 2</carname> <carname>Benteley 3</carname> </luxurycars> </cars>
QueryXmlFileDemo.java
package com.tutorialspoint.xml; 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; public class QueryXmlFileDemo { public static void main(String argv[]) { try { File inputFile = new File("input.txt"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); System.out.print("Root element: "); System.out.println(doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("supercars"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :"); System.out.print(nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.print("company : "); System.out.println(eElement.getAttribute("company")); NodeList carNameList = eElement.getElementsByTagName("carname"); for (int count = 0; count < carNameList.getLength(); count++) { Node node1 = carNameList.item(count); if (node1.getNodeType() == node1.ELEMENT_NODE) { Element car = (Element) node1; System.out.print("car name : "); System.out.println(car.getTextContent()); System.out.print("car type : "); System.out.println(car.getAttribute("type")); } } } } } catch (Exception e) { e.printStackTrace(); } } }
這將產生以下結果:
Root element: cars ---------------------------- Current Element : supercarscompany : Ferrari car name : Ferarri 101 car type : formula one car name : Ferarri 201 car type : sports car car name : Ferarri 301 car type : sports car Current Element : supercarscompany : Lamborgini car name : Lamborgini 001 car type : car name : Lamborgini 002 car type : car name : Lamborgini 003 car type :
Java DOM 解析器 - 建立 XML 文件
演示示例
這是我們需要建立的 XML:
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
CreateXmlFileDemo.java
package com.tutorialspoint.xml; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.io.File; public class CreateXmlFileDemo { public static void main(String argv[]) { try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.newDocument(); // root element Element rootElement = doc.createElement("cars"); doc.appendChild(rootElement); // supercars element Element supercar = doc.createElement("supercars"); rootElement.appendChild(supercar); // setting attribute to element Attr attr = doc.createAttribute("company"); attr.setValue("Ferrari"); supercar.setAttributeNode(attr); // carname element Element carname = doc.createElement("carname"); Attr attrType = doc.createAttribute("type"); attrType.setValue("formula one"); carname.setAttributeNode(attrType); carname.appendChild(doc.createTextNode("Ferrari 101")); supercar.appendChild(carname); Element carname1 = doc.createElement("carname"); Attr attrType1 = doc.createAttribute("type"); attrType1.setValue("sports"); carname1.setAttributeNode(attrType1); carname1.appendChild(doc.createTextNode("Ferrari 202")); supercar.appendChild(carname1); // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File("C:\\cars.xml")); transformer.transform(source, result); // Output to console for testing StreamResult consoleResult = new StreamResult(System.out); transformer.transform(source, consoleResult); } catch (Exception e) { e.printStackTrace(); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
Java DOM 解析器 - 修改 XML 文件
演示示例
這是我們需要修改的輸入 xml 檔案:
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> <luxurycars company = "Benteley"> <carname>Benteley 1</carname> <carname>Benteley 2</carname> <carname>Benteley 3</carname> </luxurycars> </cars>
ModifyXmlFileDemo.java
package com.tutorialspoint.xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; 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.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class ModifyXmlFileDemo { public static void main(String argv[]) { try { File inputFile = new File("input.xml"); DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.parse(inputFile); Node cars = doc.getFirstChild(); Node supercar = doc.getElementsByTagName("supercars").item(0); // update supercar attribute NamedNodeMap attr = supercar.getAttributes(); Node nodeAttr = attr.getNamedItem("company"); nodeAttr.setTextContent("Lamborigini"); // loop the supercar child node NodeList list = supercar.getChildNodes(); for (int temp = 0; temp < list.getLength(); temp++) { Node node = list.item(temp); if (node.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) node; if ("carname".equals(eElement.getNodeName())) { if("Ferrari 101".equals(eElement.getTextContent())) { eElement.setTextContent("Lamborigini 001"); } if("Ferrari 202".equals(eElement.getTextContent())) eElement.setTextContent("Lamborigini 002"); } } } NodeList childNodes = cars.getChildNodes(); for(int count = 0; count < childNodes.getLength(); count++) { Node node = childNodes.item(count); if("luxurycars".equals(node.getNodeName())) cars.removeChild(node); } // write the content on console TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); System.out.println("-----------Modified File-----------"); StreamResult consoleResult = new StreamResult(System.out); transformer.transform(source, consoleResult); } catch (Exception e) { e.printStackTrace(); } } }
這將產生以下結果:
-----------Modified File----------- <?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Lamborigini"> <carname type = "formula one">Lamborigini 001</carname> <carname type = "sports">Lamborigini 002</carname> </supercars> </cars>
Java SAX 解析器 - 概述
SAX (Simple API for XML) 是用於 XML 文件的基於事件的解析器。與 DOM 解析器不同,SAX 解析器不建立解析樹。SAX 是 XML 的流式介面,這意味著使用 SAX 的應用程式會接收有關正在處理的 XML 文件的事件通知,一次一個元素和屬性,按順序從文件頂部開始,以 ROOT 元素的關閉結束。
從上到下讀取 XML 文件,識別構成格式良好的 XML 文件的標記。
標記按其在文件中出現的順序進行處理。
嚮應用程式報告解析器遇到的標記的性質。
應用程式提供必須向解析器註冊的“事件”處理程式。
識別標記後,將使用相關資訊呼叫處理程式中的回撥方法。
何時使用?
您應該在以下情況下使用 SAX 解析器:
您可以從上到下以線性方式處理 XML 文件。
文件巢狀不深。
您正在處理一個非常大的 XML 文件,其 DOM 樹會消耗過多的記憶體。典型的 DOM 實現使用十個位元組的記憶體來表示一個位元組的 XML。
待解決的問題只涉及 XML 文件的一部分。
資料在解析器看到後即可使用,因此 SAX 非常適合透過流到達的 XML 文件。
SAX 的缺點
由於 XML 文件以單向方式處理,因此我們無法隨機訪問。
如果您需要跟蹤解析器已看到的資料或更改專案的順序,則必須編寫程式碼並自行儲存資料。
ContentHandler 介面
此介面指定 SAX 解析器用於通知應用程式程式其已看到的 XML 文件元件的回撥方法。
void startDocument() - 在文件開頭呼叫。
void endDocument() - 在文件結尾呼叫。
void startElement(String uri, String localName, String qName, Attributes atts) - 在元素開頭呼叫。
void endElement(String uri, String localName,String qName) - 在元素結尾呼叫。
void characters(char[] ch, int start, int length) - 遇到字元資料時呼叫。
void ignorableWhitespace( char[] ch, int start, int length) - 存在 DTD 並遇到可忽略的空格時呼叫。
void processingInstruction(String target, String data) - 識別處理指令時呼叫。
void setDocumentLocator(Locator locator)) - 提供可用於識別文件中位置的 Locator。
void skippedEntity(String name) - 遇到未解析的實體時呼叫。
void startPrefixMapping(String prefix, String uri) - 定義新的名稱空間對映時呼叫。
void endPrefixMapping(String prefix) - 名稱空間定義結束其範圍時呼叫。
Attributes 介面
此介面指定用於處理與元素連線的屬性的方法。
int getLength() - 返回屬性數量。
String getQName(int index)
String getValue(int index)
String getValue(String qname)
Java SAX 解析器 - 解析 XML 文件
演示示例
這是我們需要解析的輸入 xml 檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
UserHandler.java
package com.tutorialspoint.xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class UserHandler extends DefaultHandler { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; boolean bMarks = false; @Override 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; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("student")) { System.out.println("End Element :" + qName); } } @Override 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; } } }
SAXParserDemo.java
package com.tutorialspoint.xml; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); UserHandler userhandler = new UserHandler(); saxParser.parse(inputFile, userhandler); } catch (Exception e) { e.printStackTrace(); } } } class UserHandler extends DefaultHandler { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; boolean bMarks = false; @Override 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; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("student")) { System.out.println("End Element :" + qName); } } @Override 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; } } }
這將產生以下結果:
Roll No : 393 First Name: dinkar Last Name: kad Nick Name: dinkar Marks: 85 End Element :student Roll No : 493 First Name: Vaneet Last Name: Gupta Nick Name: vinni Marks: 95 End Element :student Roll No : 593 First Name: jasvir Last Name: singn Nick Name: jazz Marks: 90 End Element :student
Java SAX 解析器 - 查詢 XML 文件
演示示例
這是我們需要查詢 rollno: 393 的輸入文字檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
UserHandler.java
package com.tutorialspoint.xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class UserHandler extends DefaultHandler { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; boolean bMarks = false; String rollNo = null; @Override public void startElement( String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("student")) { rollNo = attributes.getValue("rollno"); } if(("393").equals(rollNo) && qName.equalsIgnoreCase("student")) { System.out.println("Start Element :" + qName); } 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; } } @Override public void endElement( String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("student")) { if(("393").equals(rollNo) && qName.equalsIgnoreCase("student")) System.out.println("End Element :" + qName); } } @Override public void characters(char ch[], int start, int length) throws SAXException { if (bFirstName && ("393").equals(rollNo)) { //age element, set Employee age System.out.println("First Name: " + new String(ch, start, length)); bFirstName = false; } else if (bLastName && ("393").equals(rollNo)) { System.out.println("Last Name: " + new String(ch, start, length)); bLastName = false; } else if (bNickName && ("393").equals(rollNo)) { System.out.println("Nick Name: " + new String(ch, start, length)); bNickName = false; } else if (bMarks && ("393").equals(rollNo)) { System.out.println("Marks: " + new String(ch, start, length)); bMarks = false; } } }
SAXQueryDemo.java
package com.tutorialspoint.xml; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXQueryDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); UserHandler userhandler = new UserHandler(); saxParser.parse(inputFile, userhandler); } catch (Exception e) { e.printStackTrace(); } } } class UserHandler extends DefaultHandler { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; boolean bMarks = false; String rollNo = null; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("student")) { rollNo = attributes.getValue("rollno"); } if(("393").equals(rollNo) && qName.equalsIgnoreCase("student")) { System.out.println("Start Element :" + qName); } 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; } } @Override public void endElement( String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("student")) { if(("393").equals(rollNo) && qName.equalsIgnoreCase("student")) System.out.println("End Element :" + qName); } } @Override public void characters( char ch[], int start, int length) throws SAXException { if (bFirstName && ("393").equals(rollNo)) { //age element, set Employee age System.out.println("First Name: " + new String(ch, start, length)); bFirstName = false; } else if (bLastName && ("393").equals(rollNo)) { System.out.println("Last Name: " + new String(ch, start, length)); bLastName = false; } else if (bNickName && ("393").equals(rollNo)) { System.out.println("Nick Name: " + new String(ch, start, length)); bNickName = false; } else if (bMarks && ("393").equals(rollNo)) { System.out.println("Marks: " + new String(ch, start, length)); bMarks = false; } } }
這將產生以下結果:
Start Element :student First Name: dinkar Last Name: kad Nick Name: dinkar Marks: 85 End Element :student
Java SAX 解析器 - 建立 XML 文件
最好使用 StAX 解析器來建立 XML 文件,而不是使用 SAX 解析器。請參閱 Java StAX 解析器部分。
Java SAX 解析器 - 修改 XML 文件
演示示例
這是我們需要修改的輸入 XML 檔案,在 </marks> 標記的末尾附加 <Result>Pass<Result/>。
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
SAXModifyDemo.java
package com.tutorialspoint.xml; import java.io.*; import org.xml.sax.*; import javax.xml.parsers.*; import org.xml.sax.helpers.DefaultHandler; public class SAXModifyDemo extends DefaultHandler { static String displayText[] = new String[1000]; static int numberLines = 0; static String indentation = ""; public static void main(String args[]) { try { File inputFile = new File("input.txt"); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXModifyDemo obj = new SAXModifyDemo(); obj.childLoop(inputFile); FileWriter filewriter = new FileWriter("newfile.xml"); for(int loopIndex = 0; loopIndex < numberLines; loopIndex++) { filewriter.write(displayText[loopIndex].toCharArray()); filewriter.write('\n'); System.out.println(displayText[loopIndex].toString()); } filewriter.close(); } catch (Exception e) { e.printStackTrace(System.err); } } public void childLoop(File input) { DefaultHandler handler = this; SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser saxParser = factory.newSAXParser(); saxParser.parse(input, handler); } catch (Throwable t) {} } public void startDocument() { displayText[numberLines] = indentation; displayText[numberLines] += "<?xml version = \"1.0\" encoding = \""+ "UTF-8" + "\"?>"; numberLines++; } public void processingInstruction(String target, String data) { displayText[numberLines] = indentation; displayText[numberLines] += "<?"; displayText[numberLines] += target; if (data != null && data.length() > 0) { displayText[numberLines] += ' '; displayText[numberLines] += data; } displayText[numberLines] += "?>"; numberLines++; } public void startElement(String uri, String localName, String qualifiedName, Attributes attributes) { displayText[numberLines] = indentation; indentation += " "; displayText[numberLines] += '<'; displayText[numberLines] += qualifiedName; if (attributes != null) { int numberAttributes = attributes.getLength(); for (int loopIndex = 0; loopIndex < numberAttributes; loopIndex++) { displayText[numberLines] += ' '; displayText[numberLines] += attributes.getQName(loopIndex); displayText[numberLines] += "=\""; displayText[numberLines] += attributes.getValue(loopIndex); displayText[numberLines] += '"'; } } displayText[numberLines] += '>'; numberLines++; } public void characters(char characters[], int start, int length) { String characterData = (new String(characters, start, length)).trim(); if(characterData.indexOf("\n") < 0 && characterData.length() > 0) { displayText[numberLines] = indentation; displayText[numberLines] += characterData; numberLines++; } } public void endElement(String uri, String localName, String qualifiedName) { indentation = indentation.substring(0, indentation.length() - 4) ; displayText[numberLines] = indentation; displayText[numberLines] += "</"; displayText[numberLines] += qualifiedName; displayText[numberLines] += '>'; numberLines++; if (qualifiedName.equals("marks")) { startElement("", "Result", "Result", null); characters("Pass".toCharArray(), 0, "Pass".length()); endElement("", "Result", "Result"); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8"?> <class> <student rollno = "393"> <firstname> dinkar </firstname> <lastname> kad </lastname> <nickname> dinkar </nickname> <marks> 85 </marks> <Result> Pass </Result> </student> <student rollno = "493"> <firstname> Vaneet </firstname> <lastname> Gupta </lastname> <nickname> vinni </nickname> <marks> 95 </marks> <Result> Pass </Result> </student> <student rollno = "593"> <firstname> jasvir </firstname> <lastname> singn </lastname> <nickname> jazz </nickname> <marks> 90 </marks> <Result> Pass </Result> </student> </class>
Java JDOM 解析器 - 概述
JDOM 是一個開源的基於 Java 的庫,用於解析 XML 文件。它通常是一個對 Java 開發人員友好的 API。它是 Java 最佳化的,它使用 Java 集合,如 List 和 Arrays。
JDOM 與 DOM 和 SAX API 協同工作,結合了兩者的優點。它記憶體佔用低,速度幾乎與 SAX 一樣快。
環境設定
為了使用 JDOM 解析器,您應該在應用程式的類路徑中包含 jdom.jar。下載 jdom-2.0.5.zip。
何時使用?
您應該在以下情況下使用 JDOM 解析器:
您需要了解 XML 文件的許多結構資訊。
您需要移動 XML 文件的部分內容(例如,您可能需要對某些元素進行排序)。
您需要多次使用 XML 文件中的資訊。
您是 Java 開發人員,並且想要利用 Java 最佳化的 XML 解析。
您將獲得什麼?
當您使用 JDOM 解析器解析 XML 文件時,您可以靈活地獲得包含文件所有元素的樹狀結構,而不會影響應用程式的記憶體佔用。
如果 XML 文件結構良好且結構已知,JDOM 提供多種實用程式函式,可用於檢查 XML 文件的內容和結構。
優點
JDOM 為 Java 開發人員提供了靈活且易於維護的 XML 解析程式碼。它是一個輕量級且快速的 API。
JDOM 類
JDOM 定義了幾個 Java 類。以下是最常用的類:
Document − 表示整個 XML 文件。Document 物件通常被稱為 DOM 樹。
Element − 表示 XML 元素。Element 物件具有操作其子元素、文字、屬性和名稱空間的方法。
Attribute − 表示元素的屬性。Attribute 具有獲取和設定屬性值的方法。它具有父級和屬性型別。
Text − 表示 XML 標籤的文字。
Comment − 表示 XML 文件中的註釋。
常用的 JDOM 方法
使用 JDOM 時,有一些方法您會經常用到:
SAXBuilder.build(xmlSource)() − 從 xml 源構建 JDOM 文件。
Document.getRootElement() − 獲取 XML 的根元素。
Element.getName() − 獲取 XML 節點的名稱。
Element.getChildren() − 獲取元素的所有直接子節點。
Node.getChildren(Name) − 獲取具有給定名稱的所有直接子節點。
Node.getChild(Name) − 獲取具有給定名稱的第一個子節點。
Java JDOM 解析器 - 解析 XML 文件
使用 JDOM 的步驟
以下是使用 JDOM 解析器解析文件時使用的步驟。
- 匯入 XML 相關的包。
- 建立 SAXBuilder
- 從檔案或流建立文件
- 提取根元素
- 檢查屬性
- 檢查子元素
匯入 XML 相關的包
import java.io.*; import java.util.*; import org.jdom2.*;
建立一個 DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
從檔案或流建立文件
File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile);
提取根元素
Element classElement = document.getRootElement();
檢查屬性
//returns specific attribute getAttribute("attributeName");
檢查子元素
//returns a list of subelements of specified name getChildren("subelementName"); //returns a list of all child nodes getChildren(); //returns first child node getChild("subelementName");
演示示例
這是我們需要解析的輸入 xml 檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DomParserDemo.java
import java.io.File; import java.io.IOException; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; public class JDomParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Element> studentList = classElement.getChildren(); System.out.println("----------------------------"); for (int temp = 0; temp < studentList.size(); temp++) { Element student = studentList.get(temp); System.out.println("\nCurrent Element :" + student.getName()); Attribute attribute = student.getAttribute("rollno"); System.out.println("Student roll no : " + attribute.getValue() ); System.out.println("First Name : " + student.getChild("firstname").getText()); System.out.println("Last Name : " + student.getChild("lastname").getText()); System.out.println("Nick Name : " + student.getChild("nickname").getText()); System.out.println("Marks : " + student.getChild("marks").getText()); } } catch(JDOMException e) { e.printStackTrace(); } catch(IOException ioe) { ioe.printStackTrace(); } } }
這將產生以下結果:
Root element :class ---------------------------- Current Element :student Student roll no : 393 First Name : dinkar Last Name : kad Nick Name : dinkar Marks : 85 Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95 Current Element :student Student roll no : 593 First Name : jasvir Last Name : singn Nick Name : jazz Marks : 90
Java JDOM 解析器 - 查詢 XML 文件
演示示例
這是我們需要查詢的輸入 xml 檔案:
<?xml version = "1.0"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferarri 101</carname> <carname type = "sports car">Ferarri 201</carname> <carname type = "sports car">Ferarri 301</carname> </supercars> <supercars company = "Lamborgini"> <carname>Lamborgini 001</carname> <carname>Lamborgini 002</carname> <carname>Lamborgini 003</carname> </supercars> <luxurycars company = "Benteley"> <carname>Benteley 1</carname> <carname>Benteley 2</carname> <carname>Benteley 3</carname> </luxurycars> </cars>
QueryXmlFileDemo.java
import java.io.File; import java.io.IOException; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; public class QueryXmlFileDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Element> supercarList = classElement.getChildren("supercars"); System.out.println("----------------------------"); for (int temp = 0; temp < supercarList.size(); temp++) { Element supercarElement = supercarList.get(temp); System.out.println("\nCurrent Element :" + supercarElement.getName()); Attribute attribute = supercarElement.getAttribute("company"); System.out.println("company : " + attribute.getValue() ); List<Element> carNameList = supercarElement.getChildren("carname"); for (int count = 0; count < carNameList.size(); count++) { Element carElement = carNameList.get(count); System.out.print("car name : "); System.out.println(carElement.getText()); System.out.print("car type : "); Attribute typeAttribute = carElement.getAttribute("type"); if(typeAttribute != null) System.out.println(typeAttribute.getValue()); else { System.out.println(""); } } } } catch(JDOMException e) { e.printStackTrace(); } catch(IOException ioe) { ioe.printStackTrace(); } } }
這將產生以下結果:
Root element :cars ---------------------------- Current Element :supercars company : Ferrari car name : Ferarri 101 car type : formula one car name : Ferarri 201 car type : sports car car name : Ferarri 301 car type : sports car Current Element :supercars company : Lamborgini car name : Lamborgini 001 car type : car name : Lamborgini 002 car type : car name : Lamborgini 003 car type :
Java JDOM 解析器 - 建立 XML 文件
演示示例
以下是我們需要建立的 XML 檔案:
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
CreateXmlFileDemo.java
import java.io.IOException; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; public class CreateXmlFileDemo { public static void main(String[] args) { try{ //root element Element carsElement = new Element("cars"); Document doc = new Document(carsElement); //supercars element Element supercarElement = new Element("supercars"); supercarElement.setAttribute(new Attribute("company","Ferrari")); //supercars element Element carElement1 = new Element("carname"); carElement1.setAttribute(new Attribute("type","formula one")); carElement1.setText("Ferrari 101"); Element carElement2 = new Element("carname"); carElement2.setAttribute(new Attribute("type","sports")); carElement2.setText("Ferrari 202"); supercarElement.addContent(carElement1); supercarElement.addContent(carElement2); doc.getRootElement().addContent(supercarElement); XMLOutputter xmlOutput = new XMLOutputter(); // display ml xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(doc, System.out); } catch(IOException e) { e.printStackTrace(); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
Java JDOM 解析器 - 修改 XML 文件
演示示例
以下是我們需要修改的輸入文字檔案:
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> <luxurycars company = "Benteley"> <carname>Benteley 1</carname> <carname>Benteley 2</carname> <carname>Benteley 3</carname> </luxurycars> </cars>
ModifyXmlFileDemo.java
import java.io.File; import java.io.IOException; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; public class ModifyXMLFileDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile); Element rootElement = document.getRootElement(); //get first supercar Element supercarElement = rootElement.getChild("supercars"); // update supercar attribute Attribute attribute = supercarElement.getAttribute("company"); attribute.setValue("Lamborigini"); // loop the supercar child node List<Element> list = supercarElement.getChildren(); for (int temp = 0; temp < list.size(); temp++) { Element carElement = list.get(temp); if("Ferrari 101".equals(carElement.getText())) { carElement.setText("Lamborigini 001"); } if("Ferrari 202".equals(carElement.getText())) { carElement.setText("Lamborigini 002"); } } //get all supercars element List<Element> supercarslist = rootElement.getChildren(); for (int temp = 0; temp < supercarslist.size(); temp++) { Element tempElement = supercarslist.get(temp); if("luxurycars".equals(tempElement.getName())) { rootElement.removeContent(tempElement); } } XMLOutputter xmlOutput = new XMLOutputter(); // display xml xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(document, System.out); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Lamborigini"> <carname type = "formula one">Lamborigini 001</carname> <carname type = "sports">Lamborigini 002</carname> </supercars> </cars>
Java StAX 解析器 - 概述
StAX 是一個基於 Java 的 API,用於以類似於 SAX 解析器的方式解析 XML 文件。但是這兩個 API 之間有兩個主要區別:
StAX 是一個拉取式 API,而 SAX 是一個推送式 API。這意味著在 StAX 解析器的情況下,客戶端應用程式需要在需要時請求 StAX 解析器從 XML 獲取資訊。但在 SAX 解析器的情況下,客戶端應用程式需要在 SAX 解析器通知客戶端應用程式資訊可用時獲取資訊。
StAX API 可以讀取和寫入 XML 文件。使用 SAX API,只能讀取 XML 檔案。
環境設定
為了使用 StAX 解析器,您的應用程式的類路徑中應該包含 stax.jar。
以下是 StAX API 的功能:
從上到下讀取 XML 文件,識別構成格式良好的 XML 文件的標記。
標記按其在文件中出現的順序進行處理。
嚮應用程式報告解析器遇到的標記的性質。
應用程式提供一個“事件”讀取器,它充當迭代器並迭代事件以獲取所需資訊。另一個可用的讀取器是“遊標”,它充當 XML 節點的指標。
識別事件後,可以從事件物件檢索 XML 元素並進一步處理。
何時使用?
在以下情況下,您應該使用 StAX 解析器:
您可以從上到下以線性方式處理 XML 文件。
文件巢狀不深。
您正在處理一個非常大的 XML 文件,其 DOM 樹會消耗過多的記憶體。典型的 DOM 實現使用十個位元組的記憶體來表示一個位元組的 XML。
待解決的問題只涉及 XML 文件的一部分。
資料一旦被解析器看到即可使用,因此 StAX 非常適合透過流到達的 XML 文件。
SAX 的缺點
我們無法隨機訪問 XML 文件,因為它以單向方式處理。
如果您需要跟蹤解析器已看到的 data 或解析器已更改項的順序的位置,則必須自行編寫程式碼並存儲 data。
XMLEventReader 類
此類提供事件迭代器,可用於在解析 XML 文件時迭代發生的事件。
StartElement asStartElement() − 用於檢索元素的值和屬性。
EndElement asEndElement() − 在元素末尾呼叫。
Characters asCharacters() − 可用於獲取字元,例如 CDATA、空格等。
XMLEventWriter 類
此介面指定建立事件的方法。
add(Event event) − 新增包含元素的事件到 XML。
XMLStreamReader 類
此類提供事件迭代器,可用於在解析 XML 文件時迭代發生的事件。
int next() − 用於檢索下一個事件。
boolean hasNext() − 用於檢查是否存在更多事件。
String getText() − 用於獲取元素的文字。
String getLocalName() − 用於獲取元素的名稱。
XMLStreamWriter 類
此介面指定建立事件的方法。
writeStartElement(String localName) − 新增給定名稱的起始元素。
writeEndElement(String localName) − 新增給定名稱的結束元素。
writeAttribute(String localName, String value) − 將屬性寫入元素。
Java StAX 解析器 - 解析 XML 文件
演示示例
這是我們需要解析的輸入 xml 檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
StAXParserDemo.java
package com.tutorialspoint.xml; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.Iterator; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; 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 StAXParserDemo { public static void main(String[] args) { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; boolean bMarks = false; try { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader eventReader = factory.createXMLEventReader(new FileReader("input.txt")); while(eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); switch(event.getEventType()) { case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement(); String qName = startElement.getName().getLocalPart(); if (qName.equalsIgnoreCase("student")) { System.out.println("Start Element : student"); Iterator<Attribute> attributes = startElement.getAttributes(); String rollNo = attributes.next().getValue(); 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; } break; case XMLStreamConstants.CHARACTERS: Characters characters = event.asCharacters(); if(bFirstName) { System.out.println("First Name: " + characters.getData()); bFirstName = false; } if(bLastName) { System.out.println("Last Name: " + characters.getData()); bLastName = false; } if(bNickName) { System.out.println("Nick Name: " + characters.getData()); bNickName = false; } if(bMarks) { System.out.println("Marks: " + characters.getData()); bMarks = false; } break; case XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement(); if(endElement.getName().getLocalPart().equalsIgnoreCase("student")) { System.out.println("End Element : student"); System.out.println(); } break; } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XMLStreamException e) { e.printStackTrace(); } } }
這將產生以下結果:
Start Element : student Roll No : 393 First Name: dinkar Last Name: kad Nick Name: dinkar Marks: 85 End Element : student Start Element : student Roll No : 493 First Name: Vaneet Last Name: Gupta Nick Name: vinni Marks: 95 End Element : student Start Element : student Roll No : 593 First Name: jasvir Last Name: singn Nick Name: jazz Marks: 90 End Element : student
Java StAX 解析器 - 查詢 XML 文件
演示示例
這是我們需要解析的輸入 xml 檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
StAXParserDemo.java
package com.tutorialspoint.xml; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.Iterator; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; 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 StAXQueryDemo { public static void main(String[] args) { boolean bFirstName = false; boolean bLastName = false; boolean bNickName = false; boolean bMarks = false; boolean isRequestRollNo = false; try { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader eventReader = factory.createXMLEventReader(new FileReader("input.txt")); String requestedRollNo = "393"; while(eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); switch(event.getEventType()) { case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement(); String qName = startElement.getName().getLocalPart(); if (qName.equalsIgnoreCase("student")) { Iterator<Attribute> attributes = startElement.getAttributes(); String rollNo = attributes.next().getValue(); if(rollNo.equalsIgnoreCase(requestedRollNo)) { System.out.println("Start Element : student"); System.out.println("Roll No : " + rollNo); isRequestRollNo = true; } } 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; } break; case XMLStreamConstants.CHARACTERS: Characters characters = event.asCharacters(); if(bFirstName && isRequestRollNo) { System.out.println("First Name: " + characters.getData()); bFirstName = false; } if(bLastName && isRequestRollNo) { System.out.println("Last Name: " + characters.getData()); bLastName = false; } if(bNickName && isRequestRollNo) { System.out.println("Nick Name: " + characters.getData()); bNickName = false; } if(bMarks && isRequestRollNo) { System.out.println("Marks: " + characters.getData()); bMarks = false; } break; case XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement(); if(endElement.getName().getLocalPart().equalsIgnoreCase( "student") && isRequestRollNo) { System.out.println("End Element : student"); System.out.println(); isRequestRollNo = false; } break; } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XMLStreamException e) { e.printStackTrace(); } } }
這將產生以下結果:
Start Element : student Roll No : 393 First Name: dinkar Last Name: kad Nick Name: dinkar Marks: 85 End Element : student
Java StAX 解析器 - 建立 XML 文件
演示示例
以下是我們需要建立的 XML:
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
StAXCreateXMLDemo.java
package com.tutorialspoint.xml; import java.io.IOException; import java.io.StringWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; public class StAXCreateXMLDemo { public static void main(String[] args) { try { StringWriter stringWriter = new StringWriter(); XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance(); XMLStreamWriter xMLStreamWriter = xMLOutputFactory.createXMLStreamWriter(stringWriter); xMLStreamWriter.writeStartDocument(); xMLStreamWriter.writeStartElement("cars"); xMLStreamWriter.writeStartElement("supercars"); xMLStreamWriter.writeAttribute("company", "Ferrari"); xMLStreamWriter.writeStartElement("carname"); xMLStreamWriter.writeAttribute("type", "formula one"); xMLStreamWriter.writeCharacters("Ferrari 101"); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeStartElement("carname"); xMLStreamWriter.writeAttribute("type", "sports"); xMLStreamWriter.writeCharacters("Ferrari 202"); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeEndElement(); xMLStreamWriter.writeEndDocument(); xMLStreamWriter.flush(); xMLStreamWriter.close(); String xmlString = stringWriter.getBuffer().toString(); stringWriter.close(); System.out.println(xmlString); } catch (XMLStreamException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
Java StAX 解析器 - 修改 XML 文件
演示示例
以下是我們需要修改的 XML:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singh</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
StAXModifyDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; public class StAXModifyDemo { public static void main(String[] args) { try { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader eventReader = factory.createXMLEventReader( new FileReader("input.txt")); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(new File("input.txt")); Element rootElement = document.getRootElement(); List<Element> studentElements = rootElement.getChildren("student"); while(eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); switch(event.getEventType()) { case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement(); String qName = startElement.getName().getLocalPart(); if (qName.equalsIgnoreCase("student")) { Iterator<Attribute> attributes = startElement.getAttributes(); String rollNo = attributes.next().getValue(); if(rollNo.equalsIgnoreCase("393")) { //get the student with roll no 393 for(int i = 0;i < studentElements.size();i++) { Element studentElement = studentElements.get(i); if(studentElement.getAttribute( "rollno").getValue().equalsIgnoreCase("393")) { studentElement.removeChild("marks"); studentElement.addContent(new Element("marks").setText("80")); } } } } break; } } XMLOutputter xmlOutput = new XMLOutputter(); // display xml xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(document, System.out); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XMLStreamException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8"?> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>80</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singh</lastname> <nickname>jazz</nickname> <marks>90</marks> </student>
Java XPath 解析器 - 概述
XPath 是全球資訊網聯盟 (W3C) 的正式推薦。它定義了一種在 XML 檔案中查詢資訊的語言。它用於遍歷 XML 文件的元素和屬性。XPath 提供各種型別的表示式,可用於從 XML 文件中查詢相關資訊。
什麼是 XPath?
結構定義 − XPath 定義 XML 文件的各個部分,例如元素、屬性、文字、名稱空間、處理指令、註釋和文件節點。
路徑表示式 − XPath 提供強大的路徑表示式,例如選擇 XML 文件中的節點或節點列表。
標準函式 − XPath 提供豐富的標準函式庫,用於操作字串值、數值、日期和時間比較、節點和 QName 操作、序列操作、布林值等。
XSLT 的主要部分 − XPath 是 XSLT 標準的主要元素之一,為了使用 XSLT 文件,必須充分了解 XPath。
W3C 推薦 − XPath 是全球資訊網聯盟 (W3C) 的正式推薦。
XPath 表示式
XPath 使用路徑表示式從 XML 文件中選擇節點或節點列表。以下是用於從 XML 文件中選擇任何節點/節點列表的有用路徑和表示式的列表。
序號 | 表示式和描述 |
---|---|
1 | node-name 選擇所有具有給定名稱“nodename”的節點 |
2 | / 選擇從根節點開始 |
3 | // 選擇從與選擇匹配的當前節點開始 |
4 | . 選擇當前節點 |
5 | .. 選擇當前節點的父節點 |
6 | @ 選擇屬性 |
7 | student 示例 − 選擇所有名為“student”的節點 |
8 | class/student 示例 − 選擇作為 class 子元素的所有 student 元素 |
9 | //student 選擇所有 student 元素,無論它們在文件中的什麼位置 |
謂詞
謂詞用於查詢特定節點或包含特定值的節點,並使用 [... ] 定義。
表示式 | 結果 |
---|---|
/class/student[1] | 選擇作為 class 元素子元素的第一個 student 元素。 |
/class/student[last()] | 選擇作為 class 元素子元素的最後一個 student 元素。 |
/class/student[last()-1] | 選擇作為 class 元素子元素的倒數第二個 student 元素。 |
//student[@rollno = '493'] | 選擇所有具有名為 rollno 的屬性且值為“493”的 student 元素 |
Java XPath 解析器 - 解析 XML 文件
使用 XPath 的步驟
以下是使用 XPath 解析器解析文件時使用的步驟。
匯入 XML 相關的包。
建立一個 DocumentBuilder。
從檔案或流建立文件。
建立一個 Xpath 物件和一個 XPath 路徑表示式。
使用 XPath.compile() 編譯 XPath 表示式,並透過 XPath.evaluate() 評估已編譯的表示式來獲取節點列表。
迭代節點列表。
檢查屬性。
檢查子元素。
匯入 XML 相關的包
import org.w3c.dom.*; import org.xml.sax.*; import javax.xml.parsers.*; import javax.xml.xpath.*; import java.io.*;
建立一個 DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();
從檔案或流建立文件
StringBuilder xmlStringBuilder = new StringBuilder(); xmlStringBuilder.append("<?xml version = "1.0"?> <class> </class>"); ByteArrayInputStream input = new ByteArrayInputStream( xmlStringBuilder.toString().getBytes("UTF-8")); Document doc = builder.parse(input);
構建 XPath
XPath xPath = XPathFactory.newInstance().newXPath();
準備路徑表示式並對其進行評估
String expression = "/class/student"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET);
迭代 NodeList
for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); ... }
檢查屬性
//returns specific attribute getAttribute("attributeName"); //returns a Map (table) of names/values getAttributes();
檢查子元素
//returns a list of subelements of specified name getElementsByTagName("subelementName"); //returns a list of all child nodes getChildNodes();
演示示例
以下是我們需要解析的輸入文字檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singh</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
XPathParserDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class XPathParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); String expression = "/class/student"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.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("Nick Name : " + eElement .getElementsByTagName("nickname") .item(0) .getTextContent()); System.out.println("Marks : " + eElement .getElementsByTagName("marks") .item(0) .getTextContent()); } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } }
這將產生以下結果:
Current Element :student Student roll no : 393 First Name : dinkar Last Name : kad Nick Name : dinkar Marks : 85 Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95 Current Element :student Student roll no : 593 First Name : jasvir Last Name : singh Nick Name : jazz Marks : 90
Java XPath 解析器 - 查詢 XML 文件
演示示例
以下是我們需要查詢的輸入文字檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
XPathParserDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class XPathParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); String expression = "/class/student[@rollno = '493']"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.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("Nick Name : " + eElement .getElementsByTagName("nickname") .item(0) .getTextContent()); System.out.println("Marks : " + eElement .getElementsByTagName("marks") .item(0) .getTextContent()); } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } }
這將產生以下結果:
Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95
Java XPath 解析器 - 建立 XML 文件
XPath 解析器僅用於導航 XML 文件。最好使用 DOM 解析器來建立 XML。請參閱 Java DOM 解析器部分。
Java XPath 解析器 - 修改 XML 文件
XPath 解析器僅用於導航 XML 文件。最好使用 DOM 解析器來修改 XML。請參閱 Java DOM 解析器部分。
Java DOM4J 解析器 - 概述
DOM4J 是一個開源的基於 Java 的庫,用於解析 XML 文件。它是一個高度靈活且記憶體高效的 API。它是 Java 最佳化的,並使用 Java 集合,如 List 和 Arrays。
DOM4J 使用 DOM、SAX、XPath 和 XSLT。它可以以非常低的記憶體佔用量解析大型 XML 文件。
環境設定
為了使用 DOM4J 解析器,您的應用程式的類路徑中應該包含 dom4j-1.6.1.jar 和 jaxen.jar。下載 dom4j-1.6.1.zip。
何時使用?
在以下情況下,您應該使用 DOM4J 解析器:
您需要了解 XML 文件的許多結構資訊。
您需要移動 XML 文件的部分內容(例如,您可能需要對某些元素進行排序)。
您需要多次使用 XML 文件中的資訊。
您是 Java 開發人員,並希望利用 Java 最佳化的 XML 解析。
您將獲得什麼?
當您使用 DOM4J 解析器解析 XML 文件時,您可以靈活地獲得包含文件所有元素的樹結構,而不會影響應用程式的記憶體佔用量。
DOM4J 提供多種實用程式函式,可用於檢查 XML 文件的內容和結構,前提是文件結構良好且結構已知。
DOM4J 使用 XPath 表示式來導航 XML 文件。
優點
DOM4J 為 Java 開發人員提供了靈活且易於維護的 XML 解析程式碼。它是一個輕量級且快速的 API。
DOM4J 類
DOM4J 定義了幾個 Java 類。以下是最常用的類:
Document - 表示整個 XML 文件。Document 物件通常被稱為 DOM 樹。
Element − 表示 XML 元素。Element 物件具有操作其子元素、文字、屬性和名稱空間的方法。
Attribute − 表示元素的屬性。Attribute 具有獲取和設定屬性值的方法。它具有父級和屬性型別。
Node − 表示 Element、Attribute 或 ProcessingInstruction。
常用的 DOM4J 方法
使用 DOM4J 時,有一些方法您會經常用到:
SAXReader.read(xmlSource)() − 從 XML 源構建 DOM4J 文件。
Document.getRootElement() − 獲取 XML 文件的根元素。
Element.node(index) − 獲取元素中特定索引處的 XML 節點。
Element.attributes() − 獲取元素的所有屬性。
Node.valueOf(@Name) − 獲取元素給定名稱的屬性的值。
Java DOM4J 解析器 - 解析 XML 文件
使用 DOM4J 的步驟
以下是使用 DOM4J 解析器解析文件時使用的步驟。
匯入 XML 相關的包。
建立一個 SAXReader。
從檔案或流建立文件。
透過呼叫 document.selectNodes() 使用 XPath 表示式獲取所需節點。
提取根元素。
迭代節點列表。
檢查屬性。
檢查子元素。
匯入 XML 相關的包
import java.io.*; import java.util.*; import org.dom4j.*;
建立一個 DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
從檔案或流建立文件
File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile);
提取根元素
Element classElement = document.getRootElement();
檢查屬性
//returns specific attribute valueOf("@attributeName");
檢查子元素
//returns first child node selectSingleNode("subelementName");
演示示例
這是我們需要解析的輸入 xml 檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DOM4JParserDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class DOM4JParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXReader reader = new SAXReader(); Document document = reader.read( inputFile ); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Node> nodes = document.selectNodes("/class/student" ); System.out.println("----------------------------"); for (Node node : nodes) { System.out.println("\nCurrent Element :" + node.getName()); System.out.println("Student roll no : " + node.valueOf("@rollno") ); System.out.println("First Name : " + node.selectSingleNode("firstname").getText()); System.out.println("Last Name : " + node.selectSingleNode("lastname").getText()); System.out.println("First Name : " + node.selectSingleNode("nickname").getText()); System.out.println("Marks : " + node.selectSingleNode("marks").getText()); } } catch (DocumentException e) { e.printStackTrace(); } } }
這將產生以下結果:
Root element :class ---------------------------- Current Element :student Student roll no : First Name : dinkar Last Name : kad First Name : dinkar Marks : 85 Current Element :student Student roll no : First Name : Vaneet Last Name : Gupta First Name : vinni Marks : 95 Current Element :student Student roll no : First Name : jasvir Last Name : singn First Name : jazz Marks : 90
Java DOM4J 解析器 - 查詢 XML 文件
演示示例
這是我們需要解析的輸入 xml 檔案:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DOM4JQueryDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class DOM4JQueryDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXReader reader = new SAXReader(); Document document = reader.read( inputFile ); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" ); System.out.println("----------------------------"); for (Node node : nodes) { System.out.println("\nCurrent Element :" + node.getName()); System.out.println("Student roll no : " + node.valueOf("@rollno") ); System.out.println("First Name : " + node.selectSingleNode("firstname").getText()); System.out.println("Last Name : " + node.selectSingleNode("lastname").getText()); System.out.println("First Name : " + node.selectSingleNode("nickname").getText()); System.out.println("Marks : " + node.selectSingleNode("marks").getText()); } } catch (DocumentException e) { e.printStackTrace(); } } }
這將產生以下結果:
Root element :class ---------------------------- Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta First Name : vinni Marks : 95
Java DOM4J 解析器 - 建立 XML 文件
演示示例
以下是我們需要建立的 XML:
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
CreateXmlFileDemo.java
package com.tutorialspoint.xml; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class DOM4JCreateXMLDemo { public static void main(String[] args) { try { Document document = DocumentHelper.createDocument(); Element root = document.addElement( "cars" ); Element supercarElement = root.addElement("supercars") .addAttribute("company", "Ferrai"); supercarElement.addElement("carname") .addAttribute("type", "Ferrari 101") .addText("Ferrari 101"); supercarElement.addElement("carname") .addAttribute("type", "sports") .addText("Ferrari 202"); // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer; writer = new XMLWriter( System.out, format ); writer.write( document ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
Java DOM4J 解析器 - 修改 XML 文件
演示示例
以下是我們需要修改的 XML:
<?xml version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DOM4jModifyXMLDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class DOM4jModifyXMLDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXReader reader = new SAXReader(); Document document = reader.read( inputFile ); Element classElement = document.getRootElement(); List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" ); for (Node node : nodes) { Element element = (Element)node; Iterator<Element> iterator = element.elementIterator("marks"); while(iterator.hasNext()) { Element marksElement = (Element)iterator.next(); marksElement.setText("80"); } } // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer; writer = new XMLWriter( System.out, format ); writer.write( document ); } catch (DocumentException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
這將產生以下結果:
<?xml version = "1.0" encoding = "UTF-8"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>80</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>