Upload
nguyen-dang-tuan-anh
View
261
Download
2
Embed Size (px)
Citation preview
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