Lập trình XML với Java
Java hỗ trợ 2 loại xml parser:
Tree Parser - DOM Parser: phân tích nội
dung tài liệu XML theo mô hình cây phân cấp
Streaming Parser - SAX Parser ( Simple API
for XML ), StAX Parser: phát sinh các sự kiện
trong quá trình duyệt tài liệu Xml
Trình bày: Ngô Bá Nam Phương
Lập trình XML với Java
Nội dung trình bày
Xml Parsers
Đọc nội dung tài liệu XML
Tạo tài liệu XML
XSLT
XML Parser
Java hỗ trợ 2 loại xml parser:
Tree Parser - DOM Parser: phân tích nội
dung tài liệu XML theo mô hình cây phân cấp
Streaming Parser - SAX Parser ( Simple API
for XML ), StAX Parser: phát sinh các sự kiện
trong quá trình duyệt tài liệu Xml
DOM Parser
Ví dụ:
Helvetica
36
Node font có 5 node con:
whitespace
name
whitespace
size
whitespace
DOM Parser
SAX Parser
Phù hợp đối với các tài liệu có kích thước
lớn và nội dung xử lý tương đối đơn giản.
Phát sinh các sự kiện tương ứng trong quá
trình đọc tài liệu. Application sẽ tạo các
event listener lắng nghe các event do
parser phát ra để truy xuất nội dung tài
liệu.
DOM Parser được xây dựng bên trên SAX
Parser. DOM Parser xây dựng cây tài liệu
DOM tree dựa trên các event nó nhận
được do SAX Parser trả về.
StAX Parser (Streaming API for XML )
Cung cấp mô hình xử lý đọc tài liệu XML
đơn giản và thuận tiện hơn SAX parser
Application sẽ gọi các hàm của parser về
các sự kiện cần quan tâm để truy xuất nội
dung tài liệu
Nội dung trình bày
Xml Parsers
Đọc nội dung tài liệu XML
Tạo tài liệu XML
XSLT
Đọc tài liệu XML
DOM Parser
XPath Expression
StAX Parser
DOM Parser
import javax.xml.parsers.*;
import org.w3c.dom.*;
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
factory.newDocumentBuilder();
Document doc = builder.parse(new
File("Sach.xml"));
DOM Parser
// truy cập node gốc của tài liệu
Element root =
doc.getDocumentElement();
// lấy về danh sách node con của một node
NodeList list = root.getChildNodes();
for(int i=0;i<list.getLength();++i)
{
// xử lý từng node
Node node = list.item(i);
…
}
DOM Parser
// Xử lý các node con dạng Element
NodeList list = root.getChildNodes();
for(int i=0;i<list.getLength();++i)
{
Node node = list.item(i);
if(node instanceof Element)
{
// xử lý node name và size
Element element = (Element) node;
…
}
}
DOM Parser
Rút trích nội dung trong node name và
size:
Element element = (Element)node; // đang truy
cập tại node name và size
Text textNode = (Text)element.getFirstChild();
String content = textNode.getData();
if(element.getTagName().equals(“name”))
name = content;
else if(element.getTagName().equals(“size”))
size = Integer.parseInt(content);
DOM Parser
Cách khác để duyệt và xử lý trên danh sách
các node con của 1 node
for(Node childNode = element.getFirstChild();
childNode != null;
childNode = childNode.getNextSibling() )
{
…
}
DOM Parser
Lấy danh sách attributes của 1 node:
getAttributes : trả về NamedNodeMap đại diện cho
danh sách các attribute của node
NamedNodeMap attributes = element.getAttributes();
for(int i=0;i<attributes.getLength();++i)
{
Node attributeNode = attributes.item(i);
String name = attributeNode.getNodeName();
String value = attributeNode.getNodeValue();
}
DOM Parser
Lấy giá trị thuộc tính thông qua tên thuộc
tính
Ví dụ:
String maSach = element.getAttribute(“MaSach”);
String tenSach = element.getAttribute(“TenSach”);
Đọc tài liệu XML
DOM Parser
XPath Expression
StAX Parser
XPath
Là các biểu thức đường dẫn cho phép truy
cập đến các node trong cây tài liệu dễ
dàng mà không cần phải duyệt và tìm
kiếm trên toàn bộ cây tài liệu.
Khởi tạo đối tượng XPath:
import javax.xml.xpath.*;
XPathFactory xpFactory =
XPathFactory.newInstance();
XPath path = xpFactory.newXPath();
XPath
Lấy giá trị của 1 element hoặc 1 attribute trong
tài liệu:
Ví dụ:
123
C#
int id =
Integer.parseInt(path.evaluate(“/EbookList/Ebook[1]/ID”,doc));
String title = path.evaluate(“/EbookList/Ebook[1]/Title”,doc);
id =
Integer.parseInt(path.evaluate(“/EbookList/Ebook[2]/@ID”,doc));
title = path.evaluate(“/EbookList/Ebook[2]/@Title”,doc);
XPath
Lấy về danh sách các Node
NodeList list =
(NodeList)path.evaluate(“/EbookList/Ebook”, doc,
XPathContants.NODESET);
Lấy về 1 node
Node node =
(Node)path.evaluate(“/EbookList/Ebook[1]”, doc,
XPathContants.NODE);
Lấy về kết quả là giá trị của một hàm
int count =
((Number)path.evaluate("count(/EbookList/Ebook)",
doc,XPathConstants.NUMBER)).intValue();
Đọc tài liệu XML
DOM Parser
XPath Expression
StAX Parser
StAX Parser - Events
Helvetica
36
START_ELEMENT, element name: font
CHARACTERS, content: white space
START_ELEMENT, element name: name
CHARACTERS, content: Helvetica
END_ELEMENT, element name: name
CHARACTERS, content: white space
START_ELEMENT, element name: size
CHARACTERS, content: 36
END_ELEMENT, element name: size
CHARACTERS, content: white space
END_ELEMENT, element name: font
StAX Parser
// Mở tài liệu xml
import javax.xml.stream.*;
XMLInputFactory factory =
XMLInputFactory.newInstance();
XMLStreamReader parser =
factory.createXMLStreamReader(new
FileReader("DBSach.xml"));
StAX Parser
while(parser.hasNext())
{
int event = parser.next();
if(event == XMLStreamConstants.START_ELEMENT)
{
if(parser.getLocalName().equals("Sach")==true)
{
sach = new Sach();
}
else if(parser.getLocalName().equals("MaSach")==true)
{
sach.setMaSach(Integer.parseInt(parser.getElementText()));
}
else if(parser.getLocalName().equals("TenSach")==true)
{
sach.setTenSach(parser.getElementText());
listSach.add(sach);
}
}
}
// Đọc và xử lý nội dung tài liệu XML
StAX Parser
Lấy giá trị thuộc tính bên trong Element:
String soTrang = parser.getAttributeValue(null,
"SoTrang");
String ISBN =
parser.getAttributeValue(null,"ISBN");
Nội dung trình bày
Xml Parsers
Đọc nội dung tài liệu XML
Tạo tài liệu XML
XSLT
Tạo tập tin XML – DOM Parser
Tạo nội dung tài liệu XML:
createElement( “nodeName” );
createTextNode( “textContent” );
appendChild( nodeName );
setAttribute( attributeName , value );
…
Tạo tập tin XML - DOM
Ví dụ:
Element root =
doc.createElement(“root”);
Element child1 =
doc.createElement(“child”);
child1.setAttribute(“at1”,”value1”);
Text textNode1 =
doc.createTextNode(“text content”);
doc.appendChild(root);
root.appendChild(child);
child.appendChild(textNode1);
Tạo tập tin XML - DOM
XML DOM API hiện thời không hỗ trợ việc kết xuất nội
dung cây tài liệu lên bộ nhớ phụ. Ta có thể sử dụng
XSLT để thực hiện:
import javax.xml.transform.*;
Transformer t =
TransformerFactory.newInstance().newTransformer();
t.setOutputProperty (OutputKeys.INDENT, "yes");
t.setOutputProperty (OutputKeys.METHOD, "xml");
t.setOutputProperty
("{}indent-amount", "2");
t.transform(new DOMSource(doc), new
StreamResult(new FileOutputStream("temp.xml")));
Tạo tập tin Xml - StAX
Sử dụng đối tượng XMLStreamWriter các
phương thức:
writeStartDocument()
writeEndDocument()
writeStartElement(“elementName”)
writeEndElement()
writeAttribute(“attributeName”,”attributeValue”)
writeCharacters(“text”)
Tạo tập tin Xml - StAX
Tạo đối tượng XMLStreamWriter
File file = new File("StAXOutput.xml");
XMLOutputFactory factory =
XMLOutputFactory.newInstance();
XMLStreamWriter writer =
factory.createXMLStreamWriter(new
FileOutputStream(file),"UTF-8");
Tạo tập tin Xml - StAX
Ví dụ:
<Sach
MaSach=“123”>
harry potter
123000
writer.writeStartDocument();
writer. writeStartElement (“Sach”);
writer. writeAttribute (“MaSach”,”123”);
writer. writeStartElement (“TenSach”);
writer. writeCharacters (“harry potter”);
writer. writeEndElement ();
writer. writeStartElement (“GiaTien”);
writer. writeCharacters (“123000”);
writer. writeEndElement ();
writer. writeEndElement ();
writer. writeEndDocument ();
Nội dung trình bày
Xml Parsers
Đọc nội dung tài liệu XML
Tạo tài liệu XML
XSLT
XSLT – XSL Transformation
Là ngôn ngữ đặc tả các luật để chuyển đổi
tài liệu XML sang format khác ( plain text,
XML, HTML, .. )
XSLT – XSL Transformation
<xsl:stylesheet
xmlns:xsl=""
version="1.0">
template1
template2
. . .
XSLT – XSL Transformation
: dùng để định nghĩa các template
<xsl:stylesheet version = '1.0„
xmlns:xsl='>
…..
Khi gặp những thẻ thỏa đk “…” thì
thực hiện những chỉ thị sau
Biểu thức XPATH
XSLT – XSL Transformation
Rút trích nội dung nằm trong các thẻ XML (
inner text hay thuộc tính của node ) và kết xuất ra file kết
quả
Nội dung rút trích được xác định thông qua thuộc tính select
Nếu select trả về một tập các thẻ thì nội dung tất cả các thẻ
này đều được kết xuất ra file kết quả
Nguyen Van A
0412341
XSLT – XSL Transformation
a1
a2
-Không có template Áp dụng xử lý mặc
định: tiếp tục so
khớp cho tất cả thẻ
con của thẻ hiện
hành
-Không có template
Mặc định: trả ra nội
dung của thẻ a1 a2
XSLT – XSL Transformation
Carl Cracker
75000
Harry Hacker
50000
Tony Tester
40000
XSLT – XSL Transformation
…..
Họ tên
Lương
Ngày sinh
XSLT – XSL Transformation
-
-
XSLT – XSL Transformation
File styleSheet = new File("transform.xsl");
StreamSource styleSource = new
StreamSource(styleSheet);
TransformerFactory factory =
TransformerFactory.newInstance();
Transformer t =
factory.newTransformer(styleSource);
File file = new File("input.xml");
t.transform(new StreamSource(file), new
StreamResult(“output.html"));
Cám ơn – Hỏi đáp
File đính kèm:
Lập trình XML với Java.pdf

