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