Apache Xerces - Hướng dẫn nhanh

XML là gì?

XML là một ngôn ngữ dựa trên văn bản đơn giản được thiết kế để lưu trữ và vận chuyển dữ liệu ở định dạng văn bản thuần túy. Nó là viết tắt của Ngôn ngữ đánh dấu mở rộng. Sau đây là một số tính năng nổi bật của XML.

  • XML là một ngôn ngữ đánh dấu.

  • XML là một ngôn ngữ dựa trên thẻ giống như HTML.

  • Các thẻ XML không được xác định trước như HTML.

  • Bạn có thể xác định các thẻ của riêng mình, đó là lý do tại sao nó được gọi là ngôn ngữ có thể mở rộng.

  • Các thẻ XML được thiết kế để tự mô tả ..

  • XML là một Khuyến nghị của W3C để lưu trữ và vận chuyển dữ liệu.

Thí dụ

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

Ưu điểm

Sau đây là những ưu điểm được cung cấp bởi XML -

  • Technology agnostic- Là văn bản thuần túy, XML độc lập với công nghệ. Nó có thể được sử dụng bởi bất kỳ công nghệ nào cho mục đích lưu trữ và truyền dữ liệu.

  • Human readable- XML ​​sử dụng định dạng văn bản đơn giản. Con người có thể đọc và hiểu được.

  • Extensible - Trong XML, các thẻ tùy chỉnh có thể được tạo và sử dụng rất dễ dàng.

  • Allow Validation - Sử dụng cấu trúc XSD, DTD và XML có thể được xác nhận một cách dễ dàng.

Nhược điểm

Sau đây là những nhược điểm của việc sử dụng XML:

  • Redundant Syntax - Thông thường tệp XML chứa nhiều thuật ngữ lặp lại.

  • Verbose - Là một ngôn ngữ dài dòng, kích thước tệp XML làm tăng chi phí truyền tải và lưu trữ.

Chương này sẽ hướng dẫn bạn quá trình thiết lập Apache Xerces trên các hệ thống chạy Windows và Linux. Apache Xerces có thể được cài đặt và tích hợp dễ dàng với môi trường Java hiện tại của bạn theo một vài bước đơn giản mà không cần bất kỳ thủ tục thiết lập phức tạp nào. Quản trị người dùng được yêu cầu trong khi cài đặt.

yêu cầu hệ thống

JDK Java SE 2 JDK 1.5 trở lên
Ký ức RAM 1 GB (khuyến nghị)
Dung lượng đĩa Không có yêu cầu tối thiểu
Phiên bản hệ điều hành Windows XP trở lên, Linux

Bây giờ chúng ta hãy tiến hành các bước cài đặt Apache Xerces.

Bước 1: Xác minh cài đặt Java của bạn

Trước hết, bạn cần cài đặt Bộ phát triển phần mềm Java (SDK) trên hệ thống của mình. Để xác minh điều này, hãy thực hiện bất kỳ lệnh nào trong hai lệnh tùy thuộc vào nền tảng bạn đang làm việc.

Nếu cài đặt Java thành công, thì nó sẽ hiển thị phiên bản hiện tại và đặc điểm kỹ thuật của cài đặt Java của bạn. Đầu ra mẫu được đưa ra trong bảng sau.

Nền tảng Chỉ huy Đầu ra mẫu
các cửa sổ Mở Command Console và nhập: java -version Phiên bản Java "1.7.0_60" Môi trường thời gian chạy Java (TM) SE (bản dựng 1.7.0_60-b19) Điểm truy cập Java (TM) Máy chủ ảo 64-bit Java (bản dựng 24.60b09, chế độ hỗn hợp)
Linux Mở cửa sổ lệnh và nhập: $ java -version Phiên bản Java "1.7.0_25" Mở JDK Runtime Environment (rhel-2.3.10.4.el6_4-x86_64) Mở JDK 64-Bit Server VM (bản dựng 23.7-b01, chế độ hỗn hợp)
  • Chúng tôi giả định rằng người đọc của hướng dẫn này đã cài đặt Java SDK phiên bản 1.7.0_60 trên hệ thống của họ.

  • Trong trường hợp bạn không có Java SDK, hãy tải xuống phiên bản hiện tại của nó từ https://www.oracle.com/technetwork/java/javase/downloads/index.html và đã cài đặt nó.

Bước 2: Đặt Môi trường Java của bạn

Đặt biến môi trường JAVA_HOME trỏ đến vị trí thư mục cơ sở nơi Java được cài đặt trên máy của bạn. Ví dụ,

Sr.No. Nền tảng & Mô tả
1

Windows

Đặt JAVA_HOME thành C: \ ProgramFiles \ java \ jdk1.7.0_60

2

Linux

Xuất JAVA_HOME = / usr / local / java-current

Nối đường dẫn đầy đủ của vị trí trình biên dịch Java vào Đường dẫn Hệ thống.

Sr.No. Nền tảng & Mô tả
1

Windows

Nối chuỗi "C: \ Program Files \ Java \ jdk1.7.0_60 \ bin" vào cuối biến hệ thống PATH.

2

Linux

Xuất PATH = $ PATH: $ JAVA_HOME / bin /

Thực thi phiên bản java lệnh từ dấu nhắc lệnh như đã giải thích ở trên.

Bước 3: Cài đặt Apache Xerces Library

Tải xuống phiên bản Apache Xerces mới nhất từ https://xerces.apache.org/mirrors.cgi"và giải nén nội dung của nó vào một thư mục mà từ đó các thư viện bắt buộc có thể được liên kết với chương trình Java của bạn. Giả sử các tệp được thu thập trong một thư mục xerces-2_11_0 trên ổ C.

Thêm đường dẫn hoàn chỉnh của năm cái lọ như được đánh dấu trong hình trên vào CLASSPATH.

Sr.No. Nền tảng & Mô tả
1

Windows

Nối các chuỗi sau vào cuối biến người dùng CLASSPATH -

C: \ xerces-2_11_0 \ Resolutionver.jar;

C: \ xerces-2_11_0 \ serializer.jar;

C: \ xerces-2_11_0 \ xercesImpl.jar;

C: \ xerces-2_11_0 \ xercesSamples.jar;

C: \ xerces-2_11_0 \ xml-apis.jar;

2

Linux

Xuất CLASSPATH = $ CLASSPATH -

/usr/share/xerces-2_11_0\resolver.jar;

/usr/share/xerces-2_11_0\serializer.jar;

/usr/share/xerces-2_11_0\xercesImpl.jar;

/usr/share/xerces-2_11_0\xercesSamples.jar;

/usr/share/xerces-2_11_0\xml-apis.jar;

Apache Xerces2 là gì?

Xerces2 là một bộ xử lý dựa trên Java và cung cấp các giao diện và triển khai tiêu chuẩn để tuân theo các tiêu chuẩn API phân tích cú pháp XML -

  • Mô hình đối tượng tài liệu (DOM) Mức 3

  • API đơn giản cho XML (SAX) 2.0.2

  • API truyền trực tuyến cho API sự kiện XML (StAX) 1.0

  • Các API Java để xử lý XML (JAXP) 1.4

Phân tích cú pháp XML là gì?

Phân tích cú pháp XML đề cập đến việc đi qua tài liệu XML để truy cập dữ liệu hoặc để sửa đổi dữ liệu theo cách này hay cách khác.

Trình phân tích cú pháp XML là gì?

Trình phân tích cú pháp XML cung cấp một cách để truy cập hoặc sửa đổi dữ liệu có trong tài liệu XML. Java cung cấp nhiều tùy chọn để phân tích cú pháp tài liệu XML. Sau đây là các loại trình phân tích cú pháp khác nhau thường được sử dụng để phân tích cú pháp các tài liệu XML.

  • Dom Parser - Phân tích cú pháp tài liệu bằng cách tải toàn bộ nội dung của tài liệu và tạo cây phân cấp hoàn chỉnh trong bộ nhớ.

  • SAX Parser- Phân tích cú pháp tài liệu trên các trình kích hoạt dựa trên sự kiện. Không tải toàn bộ tài liệu vào bộ nhớ.

  • StAX Parser - Phân tích cú pháp tài liệu theo cách tương tự như trình phân tích cú pháp SAX nhưng theo cách hiệu quả hơn.

Bây giờ, chúng ta sẽ trình bày chi tiết từng trình phân tích cú pháp bằng cách sử dụng thư viện Apache Xerces trong các chương tiếp theo của chúng ta.

Mô hình Đối tượng Tài liệu là một khuyến nghị chính thức của World Wide Web Consortium (W3C). Nó định nghĩa một giao diện cho phép các chương trình truy cập và cập nhật kiểu, cấu trúc và nội dung của các tài liệu XML. Các trình phân tích cú pháp XML hỗ trợ DOM, triển khai giao diện đó.

Sử dụng khi nào?

Bạn nên sử dụng trình phân tích cú pháp DOM khi -

  • Bạn cần biết nhiều về cấu trúc của một tài liệu.

  • Bạn cần di chuyển các phần của tài liệu xung quanh (ví dụ: bạn có thể muốn sắp xếp các phần tử nhất định).

  • Bạn cần sử dụng thông tin trong tài liệu nhiều lần.

Những gì bạn nhận được?

Khi bạn phân tích cú pháp tài liệu XML bằng trình phân tích cú pháp DOM, bạn sẽ lấy lại cấu trúc cây chứa tất cả các phần tử của tài liệu của bạn. DOM cung cấp nhiều chức năng khác nhau mà bạn có thể sử dụng để kiểm tra nội dung và cấu trúc của tài liệu.

Ưu điểm

DOM là một giao diện chung để thao tác các cấu trúc tài liệu. Một trong những mục tiêu thiết kế của nó là mã Java được viết cho một trình phân tích cú pháp tuân thủ DOM sẽ chạy trên bất kỳ trình phân tích cú pháp tuân thủ DOM nào khác mà không có thay đổi.

Giao diện DOM

DOM xác định một số giao diện Java. Dưới đây là các giao diện phổ biến nhất -

  • Node - Kiểu dữ liệu cơ sở của DOM.

  • Element - Phần lớn các đối tượng mà bạn sẽ đối phó là Nguyên tố.

  • Attr - Biểu diễn một thuộc tính của một phần tử.

  • Text - Nội dung thực tế của một Phần tử hoặc Attr.

  • Document- Đại diện cho toàn bộ tài liệu XML. Đối tượng Document thường được gọi là cây DOM.

Các phương pháp DOM phổ biến

Khi bạn đang làm việc với DOM, có một số phương pháp được sử dụng thường xuyên:

  • Document.getDocumentElement() - Trả về phần tử gốc của tài liệu.

  • Node.getFirstChild() - Trả về con đầu tiên của một Node đã cho.

  • Node.getLastChild() - Trả về con cuối cùng của một Node đã cho.

  • Node.getNextSibling() - Các phương thức này trả về anh chị em tiếp theo của một Node nhất định.

  • Node.getPreviousSibling() - Các phương thức này trả về anh chị em trước của một Node nhất định.

  • Node.getAttribute(attrName) - Đối với một Node đã cho, trả về thuộc tính có tên được yêu cầu.

Các bước sử dụng DOM

Sau đây là các bước được sử dụng khi phân tích cú pháp tài liệu bằng Trình phân tích cú pháp DOM.

  • Nhập các gói liên quan đến XML.

  • Tạo một DocumentBuilder

  • Tạo tài liệu từ tệp hoặc luồng

  • Trích xuất phần tử gốc

  • Kiểm tra các thuộc tính

  • Kiểm tra các yếu tố phụ

Nhập các gói liên quan đến XML

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

Tạo một DocumentBuilder

DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

Tạo tài liệu từ tệp hoặc luồng

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

Trích xuất phần tử gốc

Element root = document.getDocumentElement();

Kiểm tra các thuộc tính

//returns specific attribute
getAttribute("attributeName"); 
//returns a Map (table) of names/values
getAttributes();

Kiểm tra các yếu tố phụ

//returns a list of subelements of specified name
getElementsByTagName("subelementName"); 
//returns a list of all child nodes
getChildNodes();

Demo Example

Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -

<?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>Vineet</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>

Ví dụ demo

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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

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

Ví dụ demo

Đây là tệp xml đầu vào mà chúng tôi cần truy vấn -

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

Ví dụ demo

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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

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 :

Ví dụ demo

Đây là XML chúng ta cần tạo -

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

Ví dụ demo

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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

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

Ví dụ demo

Đây là tệp xml đầu vào mà chúng tôi cần sửa đổi -

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

Ví dụ demo

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.txt"); 	    	
      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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

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

SAX (API đơn giản cho XML) là một trình phân tích cú pháp dựa trên sự kiện cho các tài liệu xml. Không giống như trình phân tích cú pháp DOM, trình phân tích cú pháp SAX không tạo ra cây phân tích cú pháp. SAX là một giao diện trực tuyến cho XML, có nghĩa là các ứng dụng sử dụng SAX nhận thông báo sự kiện về tài liệu XML đang được xử lý - một phần tử và thuộc tính, tại một thời điểm theo thứ tự tuần tự bắt đầu từ đầu tài liệu và kết thúc bằng việc đóng phần tử ROOT.

  • Đọc tài liệu XML từ trên xuống dưới, nhận ra các mã thông báo tạo nên một tài liệu XML được định dạng tốt.

  • Các mã thông báo được xử lý theo thứ tự giống như chúng xuất hiện trong tài liệu.

  • Báo cáo chương trình ứng dụng, bản chất của các mã thông báo mà trình phân tích cú pháp đã gặp phải khi chúng xảy ra.

  • Chương trình ứng dụng cung cấp một trình xử lý "sự kiện" phải được đăng ký với trình phân tích cú pháp.

  • Khi các mã được xác định, các phương thức gọi lại trong trình xử lý được gọi với thông tin liên quan.

Sử dụng khi nào?

Bạn nên sử dụng trình phân tích cú pháp SAX khi -

  • Bạn có thể xử lý tài liệu XML theo kiểu tuyến tính từ trên xuống dưới.

  • Tài liệu không được lồng sâu.

  • Bạn đang xử lý một tài liệu XML rất lớn, cây DOM sẽ tiêu tốn rất nhiều bộ nhớ. Các triển khai DOM điển hình sử dụng mười byte bộ nhớ để biểu diễn một byte XML.

  • Vấn đề cần giải quyết chỉ liên quan đến một phần của tài liệu XML.

  • Dữ liệu có sẵn ngay khi nó được trình phân tích cú pháp nhìn thấy, vì vậy SAX hoạt động tốt cho một tài liệu XML đến qua một luồng.

Nhược điểm của SAX

  • Chúng tôi không có quyền truy cập ngẫu nhiên vào một tài liệu XML vì nó được xử lý theo phương thức chuyển tiếp.

  • Nếu bạn cần theo dõi dữ liệu mà trình phân tích cú pháp đã nhìn thấy hoặc thay đổi thứ tự của các mục, bạn phải viết mã và lưu trữ dữ liệu của riêng mình.

Giao diện ContentHandler

Giao diện này chỉ định các phương thức gọi lại mà trình phân tích cú pháp SAX sử dụng để thông báo cho một chương trình ứng dụng về các thành phần của tài liệu XML mà nó đã thấy.

  • void startDocument() - Được gọi ở đầu tài liệu.

  • void endDocument() - Được gọi ở đầu tài liệu.

  • void startElement(String uri, String localName, String qName, Attributes atts) - Được gọi ở đầu một phần tử.

  • void endElement(String uri, String localName,String qName) - Được gọi ở cuối một phần tử.

  • void characters(char[] ch, int start, int length) - Được gọi khi gặp dữ liệu ký tự.

  • void ignorableWhitespace( char[] ch, int start, int length) - Được gọi khi có DTD và gặp phải khoảng trắng có thể bỏ qua.

  • void processingInstruction(String target, String data) - Được gọi khi một lệnh xử lý được nhận dạng.

  • void setDocumentLocator(Locator locator)) - Cung cấp Bộ định vị có thể được sử dụng để xác định các vị trí trong tài liệu.

  • void skippedEntity(String name) - Được gọi khi gặp một thực thể chưa được giải quyết.

  • void startPrefixMapping(String prefix, String uri) - Được gọi khi một ánh xạ không gian tên mới được xác định.

  • void endPrefixMapping(String prefix) - Được gọi khi một định nghĩa không gian tên kết thúc phạm vi của nó.

Giao diện thuộc tính

Giao diện này chỉ định các phương pháp để xử lý các thuộc tính được kết nối với một phần tử.

  • int getLength() - Trả về số lượng thuộc tính.

  • String getQName(int index)

  • String getValue(int index)

  • String getValue(String qname)

Ví dụ demo

Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -

<?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>Vineet</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>

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

Chương trình trên sẽ tạo ra kết quả sau:

Roll No : 393
First Name: Dinkar
Last Name: Kad
Nick Name: Dinkar
Marks: 85
End Element :student
Roll No : 493
First Name: Vineet
Last Name: Gupta
Nick Name: Vinni
Marks: 95
End Element :student
Roll No : 593
First Name: Jasvir
Last Name: Singh
Nick Name: Jazz
Marks: 90
End Element :student

Ví dụ demo

Đây là tệp văn bản đầu vào chúng ta cần Truy vấn cho cuộn số: 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>Vineet</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>

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

Chương trình trên sẽ tạo ra kết quả sau:

Start Element :student
First Name: Dinkar
Last Name: Kad
Nick Name: Dinkar
Marks: 85
End Element :student

Tốt hơn là sử dụng trình phân tích cú pháp StAX để tạo XML hơn là sử dụng trình phân tích cú pháp SAX. Vui lòng tham khảo phần Java StAX Parser để biết thêm.

Ví dụ demo

Đây là tệp xml đầu vào mà chúng tôi cần Sửa đổi bằng cách thêm vào <Result>Pass<Result/> ở cuối </marks> tag.

<?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>Vineet</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>

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");
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

<?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>
         Vineet
      </firstname>

      <lastname>
         Gupta
      </lastname>

      <nickname>
         Vinni
      </nickname>

      <marks>
         95
      </marks>

      <Result>
         Pass
      </Result>
   </student>
    
   <student rollno = "593">
      <firstname>
         Jasvir
      </firstname>

      <lastname>
         Singh
      </lastname>

      <nickname>
         Jazz
      </nickname>

      <marks>
        90
      </marks>

      <Result>
         Pass
      </Result>
   </student>
</class>

StAX là một API dựa trên JAVA để phân tích cú pháp tài liệu XML theo cách tương tự như trình phân tích cú pháp SAX. Nhưng có hai điểm khác biệt chính giữa hai API -

  • StAX là một API PULL trong khi SAX là một API PUSH. Có nghĩa là trong trường hợp phân tích cú pháp StAX, ứng dụng khách cần yêu cầu trình phân tích cú pháp StAX lấy thông tin từ XML bất cứ khi nào nó cần nhưng trong trường hợp trình phân tích cú pháp SAX, ứng dụng khách được yêu cầu lấy thông tin khi trình phân tích SAX thông báo cho ứng dụng khách thông tin đó có sẵn.

  • API StAX có thể đọc cũng như viết các tài liệu XML. Sử dụng SAX API, chỉ có thể đọc xml.

Sau đây là các tính năng của API StAX:

  • Đọc tài liệu XML từ trên xuống dưới, nhận ra các mã thông báo tạo nên một tài liệu XML được định dạng tốt.

  • Các mã thông báo được xử lý theo thứ tự giống như chúng xuất hiện trong tài liệu.

  • Báo cáo chương trình ứng dụng về bản chất của các mã thông báo mà trình phân tích cú pháp đã gặp phải khi chúng xảy ra.

  • Chương trình ứng dụng cung cấp một trình đọc "sự kiện" hoạt động như một trình lặp và lặp lại sự kiện để lấy thông tin cần thiết. Một trình đọc khác có sẵn là trình đọc "con trỏ" hoạt động như một con trỏ đến các nút xml.

  • Khi các sự kiện được xác định, các phần tử xml có thể được truy xuất từ ​​đối tượng sự kiện và có thể được xử lý thêm.

Sử dụng khi nào?

Bạn nên sử dụng trình phân tích cú pháp StAX khi -

  • Bạn có thể xử lý tài liệu XML theo kiểu tuyến tính từ trên xuống dưới.

  • Tài liệu không được lồng sâu.

  • Bạn đang xử lý một tài liệu XML rất lớn, cây DOM sẽ chiếm quá nhiều bộ nhớ. Các triển khai DOM điển hình sử dụng mười byte bộ nhớ để biểu diễn một byte XML.

  • Vấn đề cần giải quyết chỉ liên quan đến một phần của tài liệu XML.

  • Dữ liệu có sẵn ngay sau khi nó được trình phân tích cú pháp nhìn thấy, vì vậy StAX hoạt động tốt đối với một tài liệu XML đến qua một luồng.

Nhược điểm của SAX

  • Chúng tôi không có quyền truy cập ngẫu nhiên vào tài liệu XML vì nó được xử lý theo cách chỉ chuyển tiếp.

  • Nếu bạn cần theo dõi dữ liệu mà trình phân tích cú pháp đã nhìn thấy hoặc thay đổi thứ tự của các mục, bạn phải viết mã và lưu trữ dữ liệu của riêng mình.

Lớp XMLEventReader

Lớp này cung cấp trình lặp các sự kiện có thể được sử dụng để lặp lại các sự kiện khi chúng xảy ra trong khi phân tích cú pháp tài liệu XML

  • StartElement asStartElement() - Dùng để lấy giá trị và thuộc tính của phần tử.

  • EndElement asEndElement() - Được gọi ở cuối một phần tử.

  • Characters asCharacters() - Có thể được sử dụng để lấy các ký tự như CDATA, khoảng trắng, v.v.

Lớp XMLEventWriter

Giao diện này chỉ định các phương pháp để tạo một sự kiện.

  • add(Event event) - Thêm sự kiện có chứa các phần tử vào XML.

Lớp XMLStreamReader

Lớp này cung cấp trình lặp các sự kiện có thể được sử dụng để lặp lại các sự kiện khi chúng xảy ra trong khi phân tích cú pháp tài liệu XML

  • int next() - Dùng để truy xuất sự kiện tiếp theo.

  • boolean hasNext() - Dùng để kiểm tra các sự kiện khác có tồn tại hay không

  • String getText() - Được sử dụng để lấy văn bản của một phần tử

  • String getLocalName() - Được sử dụng để lấy tên của một phần tử

Lớp XMLStreamWriter

Giao diện này chỉ định các phương pháp để tạo một sự kiện.

  • writeStartElement(String localName) - Thêm phần tử bắt đầu của một tên nhất định.

  • writeEndElement(String localName) - Thêm phần tử cuối của một tên nhất định.

  • writeAttribute(String localName, String value) - Viết thuộc tính cho một phần tử.

Ví dụ demo

Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -

<?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>Vineet</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>

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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

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: Vineet
Last Name: Gupta
Nick Name: Vinni
Marks: 95
End Element : student

Start Element : student
Roll No : 593
First Name: Jasvir
Last Name: Singh
Nick Name: Jazz
Marks: 90
End Element : student

Ví dụ demo

Đây là tệp xml đầu vào mà chúng ta cần phân tích cú pháp -

<?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>Vineet</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>

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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

Start Element : student
Roll No : 393
First Name: Dinkar
Last Name: Kad
Nick Name: Dinkar
Marks: 85
End Element : student

Ví dụ demo

Here is the XML we need to create −

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

Ví dụ demo

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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

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

Ví dụ demo

Để chạy ví dụ này, bạn nên có jdom.jar trong classpath của ứng dụng. Tải xuống jdom-2.0.5.zip.

Đây là XML mà chúng tôi cần sửa đổi -

<?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>Vineet</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>

Ví dụ demo

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();
      }
   }
}

Chương trình trên sẽ tạo ra kết quả sau:

<student rollno = "393">
   <firstname>Dinkar</firstname>
   <lastname>Kad</lastname>
   <nickname>Dinkar</nickname>
   <marks>80</marks>
</student>

<student rollno = "493">
   <firstname>Vineet</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>