43
Trình bày: Ngô Bá Nam Phương Lập trình XML với Java

14. Java XML

Embed Size (px)

Citation preview

Page 1: 14. Java XML

Trình bày: Ngô Bá Nam Phương

Lập trình XML với Java

Page 2: 14. Java XML

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

Page 3: 14. Java XML

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

Page 4: 14. Java XML

DOM Parser

Ví dụ:

<font>

<name>Helvetica</name>

<size>36</size>

</font>

Node font có 5 node con:

whitespace

name

whitespace

size

whitespace

Page 5: 14. Java XML

DOM Parser

Page 6: 14. Java XML

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

Page 7: 14. Java XML

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

Page 8: 14. Java XML

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

Page 9: 14. Java XML

Đọc tài liệu XML

DOM Parser

XPath Expression

StAX Parser

Page 10: 14. Java XML

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

Page 11: 14. Java 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);

}

Page 12: 14. Java XML

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

Page 13: 14. Java XML

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

Page 14: 14. Java XML

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

{

}

Page 15: 14. Java XML

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

}

Page 16: 14. Java XML

DOM Parser

Lấy giá trị thuộc tính thông qua tên thuộc tính

Ví dụ:

<Sach MaSach=“1” TenSach=“VB.NET” />

String maSach = element.getAttribute(“MaSach”);

String tenSach = element.getAttribute(“TenSach”);

Page 17: 14. Java XML

Đọc tài liệu XML

DOM Parser

XPath Expression

StAX Parser

Page 18: 14. Java XML

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

Page 19: 14. Java XML

XPath

Lấy giá trị của 1 element hoặc 1 attribute trong tài liệu:

Ví dụ: <EbookList> <Ebook> <ID>123</ID> <Title>C#</Title> </Ebook> <Ebook ID=“234” Title=“Vb.net” /> </EbookList> 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);

Page 20: 14. Java XML

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

Page 21: 14. Java XML

Đọc tài liệu XML

DOM Parser

XPath Expression

StAX Parser

Page 22: 14. Java XML

StAX Parser - Events

<font>

<name>

Helvetica

</name>

<size units="pt">

36

</size>

</font>

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

Page 23: 14. Java XML

StAX Parser

// Mở tài liệu xml

import javax.xml.stream.*;

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLStreamReader parser = factory.createXMLStreamReader(new FileReader("DBSach.xml"));

Page 24: 14. Java 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

Page 25: 14. Java XML

StAX Parser

Lấy giá trị thuộc tính bên trong Element:

<Sach SoTrang="102" ISBN="104">

String soTrang = parser.getAttributeValue(null, "SoTrang");

String ISBN = parser.getAttributeValue(null,"ISBN");

Page 26: 14. Java XML

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

Page 27: 14. Java XML

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

Page 28: 14. Java XML

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

Page 29: 14. Java XML

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 ("{http://xml.apache.org/xslt}indent-amount", "2");

t.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("temp.xml")));

Page 30: 14. Java 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”)

Page 31: 14. Java XML

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

Page 32: 14. Java XML

Tạo tập tin Xml - StAX

Ví dụ:

<Sach MaSach=“123”>

<TenSach>

harry potter

</TenSach>

<GiaTien>

123000

</GiaTien>

</Sach>

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

Page 33: 14. Java XML

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

Page 34: 14. Java XML

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, .. )

Page 35: 14. Java XML

XSLT – XSL Transformation

<?xml version="1.0" encoding=“utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/>

template1

template2 . . . </xsl:stylesheet>

Page 36: 14. Java XML

XSLT – XSL Transformation

<xsl:template>: dùng để định nghĩa các template <xsl:stylesheet version = '1.0„ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match=“…"> <h1> <xsl:value-of select="//element1“ /> </h1> <h2> <xsl:value-of select="//element2“ /> </h2> </xsl:template> <xsl:template match=“…"> ….. </xsl:template> </xsl:stylesheet>

Khi gặp những thẻ thỏa đk “…” thì

thực hiện những chỉ thị sau

Biểu thức XPATH

Page 37: 14. Java XML

XSLT – XSL Transformation

<xsl:value-of> 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ả

<hocsinh>

<hoten>Nguyen Van A</hoten>

<mssv>0412341</mssv>

</hocsinh>

<xsl:stylesheet….>

<xsl:template match=“/”>

<h1><xsl:value-of select=“//hoten”/></h1>

<h2><xsl:value-of select=“//mssv”/></h2>

</xsl:template>

</xsl:stylesheet>

Page 38: 14. Java XML

XSLT – XSL Transformation

<xsl:apply-templates >

<source>

<a1>a1</a1>

<a2>a2</a2>

</source>

<xsl:stylesheet…………> </xsl:stylesheet>

-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

<xsl:template match=“/”>

</xsl:template> <xsl:apply-templates/>

Page 39: 14. Java XML

XSLT – XSL Transformation

<?xml version="1.0" encoding="UTF-8"?> <staff> <employee> <name>Carl Cracker</name> <salary>75000</salary> <hiredate year="1987" month="12" day="15"/> </employee> <employee> <name>Harry Hacker</name> <salary>50000</salary> <hiredate year="1989" month="10" day="1"/> </employee> <employee> <name>Tony Tester</name> <salary>40000</salary> <hiredate year="1990" month="3" day="15"/> </employee> </staff>

Page 40: 14. Java XML

XSLT – XSL Transformation

<xsl:output method="xml" indent="yes"/>

…..

<xsl:template match="/">

<table border="1" >

<tr>

<td>Họ tên</td>

<td>Lương</td>

<td>Ngày sinh</td>

</tr>

<xsl:apply-templates select="/staff/employee" />

</table>

</xsl:template>

Page 41: 14. Java XML

XSLT – XSL Transformation

<xsl:template match="employee">

<tr>

<Td>

<xsl:value-of select="name" />

</Td>

<td>

<xsl:value-of select="salary" />

</td>

<td>

<xsl:value-of select="hiredate/@day" /> -

<xsl:value-of select="hiredate/@month" /> -

<xsl:value-of select="hiredate/@year" />

</td>

</tr>

</xsl:template>

Page 42: 14. Java XML

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

Page 43: 14. Java XML

Cám ơn – Hỏi đáp