14. java xml

Post on 06-Mar-2015

262 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

<font>

<name>Helvetica</name>

<size>36</size>

</font>

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

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

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

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

<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

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:

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

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 ("{http://xml.apache.org/xslt}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”>

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

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

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

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

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>

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

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>

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>

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>

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

top related