Java 해석 XML의 네 가지 방법 이해

16918 단어 javaxml
XML은 현재 이미 통용되는 데이터 교환 형식이 되었고 플랫폼은 무관성, 언어는 무관성, 시스템은 무관성으로 데이터 통합과 상호작용에 큰 편의를 가져왔다.XML 자체의 문법 지식과 기술 세부 사항에 대해 관련 기술 문헌을 읽어야 한다. 여기에 포함된 내용은 DOM(Document Object Model), DTD(Document Type Definition), SAX(Simple API for XML), XSD(Xml Schema Definition), XSLT(Extensible Stylesheet Language Transformations)이다. 구체적으로 w3c 공식 사이트 문서를 참조할 수 있다http://www.w3.org 더 많은 정보를 얻을 수 있습니다.
XML은 서로 다른 언어에서 해석 방식이 모두 같지만 실현된 문법이 다를 뿐이다.기본적인 해석 방식은 두 가지가 있는데 하나는 SAX이고 다른 하나는 DOM이다.SAX는 이벤트 흐름 기반, DOM은 XML 문서 트리 구조 기반입니다.XML의 컨텐트와 구조는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>  
<employees>  
<employee>  
<name>ddviplinux</name>  
<sex>m</sex>  
<age>30</age>  
</employee>  
</employees> 
본고는 Java 언어를 사용하여 DOM과 SAX의 XML 문서 생성과 해석을 실현합니다.
먼저 XML 문서를 조작하는 인터페이스를 정의합니다. XmlDocument는 XML 문서의 구축과 해석을 위한 인터페이스를 정의합니다.

/** 
* 
* @author hongliang.dinghl 
*  XML  
*/  
public interface XmlDocument {  
/** 
*  XML  
* @param fileName   
*/  
public void createXml(String fileName);  
/** 
*  XML  
* @param fileName   
*/  
public void parserXml(String fileName);  
}  
1. DOM XML 문서 생성 및 해석
XML 문서의 해결된 버전에 대한 인터페이스 세트가 정의됩니다.해상도가 전체 문서를 읽고 메모리가 있는 트리 구조를 구축하면 코드는 DOM 인터페이스를 사용하여 이 트리 구조를 조작할 수 있습니다.장점: 전체 문서 트리가 메모리에 있어 조작하기 편리하다.삭제, 수정, 재배열 등 다양한 기능 지원;단점: 전체 문서를 메모리에 불러와 시간과 공간을 낭비한다.사용 장소: 문서를 해석하면 이 데이터에 여러 번 접근해야 한다.하드웨어 리소스가 충분합니다(메모리, CPU).

import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.PrintWriter;  
import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
import javax.xml.parsers.ParserConfigurationException;  
import javax.xml.transform.OutputKeys;  
import javax.xml.transform.Transformer;  
import javax.xml.transform.TransformerConfigurationException;  
import javax.xml.transform.TransformerException;  
import javax.xml.transform.TransformerFactory;  
import javax.xml.transform.dom.DOMSource;  
import javax.xml.transform.stream.StreamResult;  
import org.w3c.dom.Document;  
import org.w3c.dom.Element;  
import org.w3c.dom.Node;  
import org.w3c.dom.NodeList;  
import org.xml.sax.SAXException;  
/** 
* 
* @author hongliang.dinghl 
* DOM XML  
*/  
public class DomDemo implements XmlDocument {  
private Document document;  
private String fileName;  
public void init() {  
try {  
DocumentBuilderFactory factory = DocumentBuilderFactory  
.newInstance();  
DocumentBuilder builder = factory.newDocumentBuilder();  
this.document = builder.newDocument();  
} catch (ParserConfigurationException e) {  
System.out.println(e.getMessage());  
}  
}  
public void createXml(String fileName) {  
Element root = this.document.createElement("employees");  
this.document.appendChild(root);  
Element employee = this.document.createElement("employee");  
Element name = this.document.createElement("name");  
name.appendChild(this.document.createTextNode(" "));  
employee.appendChild(name);  
Element sex = this.document.createElement("sex");  
sex.appendChild(this.document.createTextNode("m"));  
employee.appendChild(sex);  
Element age = this.document.createElement("age");  
age.appendChild(this.document.createTextNode("30"));  
employee.appendChild(age);  
root.appendChild(employee);  
TransformerFactory tf = TransformerFactory.newInstance();  
try {  
Transformer transformer = tf.newTransformer();  
DOMSource source = new DOMSource(document);  
transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");  
transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));  
StreamResult result = new StreamResult(pw);  
transformer.transform(source, result);  
System.out.println(" XML !");  
} catch (TransformerConfigurationException e) {  
System.out.println(e.getMessage());  
} catch (IllegalArgumentException e) {  
System.out.println(e.getMessage());  
} catch (FileNotFoundException e) {  
System.out.println(e.getMessage());  
} catch (TransformerException e) {  
System.out.println(e.getMessage());  
}  
}  
public void parserXml(String fileName) {  
try {  
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
DocumentBuilder db = dbf.newDocumentBuilder();  
Document document = db.parse(fileName);  
NodeList employees = document.getChildNodes();  
for (int i = 0; i < employees.getLength(); i++) {  
Node employee = employees.item(i);  
NodeList employeeInfo = employee.getChildNodes();  
for (int j = 0; j < employeeInfo.getLength(); j++) {  
Node node = employeeInfo.item(j);  
NodeList employeeMeta = node.getChildNodes();  
for (int k = 0; k < employeeMeta.getLength(); k++) {  
System.out.println(employeeMeta.item(k).getNodeName()  
+ ":" + employeeMeta.item(k).getTextContent());  
}  
}  
}  
System.out.println(" ");  
} catch (FileNotFoundException e) {  
System.out.println(e.getMessage());  
} catch (ParserConfigurationException e) {  
System.out.println(e.getMessage());  
} catch (SAXException e) {  
System.out.println(e.getMessage());  
} catch (IOException e) {  
System.out.println(e.getMessage());  
}  
}  
}  
2. SAX XML 문서 생성 및 해석
DOM 문제를 해결하기 위해 SAX가 발생했습니다.SAX, 이벤트 구동.해상도가 원소의 시작, 원소의 끝, 텍스트, 문서의 시작 또는 끝 등을 발견하면 이벤트를 보내고 프로그래머는 이 이벤트에 응답하는 코드를 작성하여 데이터를 저장합니다.장점: 사전에 전체 문서를 불러오지 않고 자원을 적게 차지한다.SAX 해상도는 DOM 해상도보다 코드가 작아 Applet, 다운로드에 적합합니다.단점: 오래 지속되는 것이 아니다.사건이 끝난 후에 데이터를 저장하지 않으면 데이터를 잃어버린다.무상태성;이벤트에서 텍스트만 얻을 수 있지만 이 텍스트가 어느 요소에 속하는지 알 수 없습니다.사용 장소: Applet;XML 문서의 소량만 있으면 뒤돌아보는 접근이 적다.기계 메모리가 적다.

import java.io.FileInputStream;   
import java.io.FileNotFoundException;   
import java.io.IOException;   
import java.io.InputStream;   
 
import javax.xml.parsers.ParserConfigurationException;   
import javax.xml.parsers.SAXParser;   
import javax.xml.parsers.SAXParserFactory;   
 
import org.xml.sax.Attributes;   
import org.xml.sax.SAXException;   
import org.xml.sax.helpers.DefaultHandler;   
/**  
*  
* @author hongliang.dinghl  
* SAX   
*/  
public class SaxDemo implements XmlDocument {   
 
public void createXml(String fileName) {   
System.out.println("<<"+filename+">>");   
}   
 
public void parserXml(String fileName) {   
SAXParserFactory saxfac = SAXParserFactory.newInstance();   
 
try {   
 
SAXParser saxparser = saxfac.newSAXParser();   
 
InputStream is = new FileInputStream(fileName);   
 
saxparser.parse(is, new MySAXHandler());   
 
} catch (ParserConfigurationException e) {   
 
e.printStackTrace();   
 
} catch (SAXException e) {   
 
e.printStackTrace();   
 
} catch (FileNotFoundException e) {   
 
e.printStackTrace();   
 
} catch (IOException e) {   
 
e.printStackTrace();   
 
}   
 
}   
 
}   
 
class MySAXHandler extends DefaultHandler {   
 
boolean hasAttribute = false;   
 
Attributes attributes = null;   
 
public void startDocument() throws SAXException {   
 
System.out.println(" ");   
 
}   
 
public void endDocument() throws SAXException {   
 
System.out.println(" ");   
 
}   
 
public void startElement(String uri, String localName, String qName,   
 
Attributes attributes) throws SAXException {   
 
if (qName.equals("employees")) {   
 
return;   
 
}   
 
if (qName.equals("employee")) {   
 
System.out.println(qName);   
 
}   
 
if (attributes.getLength() > 0) {   
 
this.attributes = attributes;   
 
this.hasAttribute = true;   
 
}   
 
}   
 
public void endElement(String uri, String localName, String qName)   
 
throws SAXException {   
 
if (hasAttribute && (attributes != null)) {   
 
for (int i = 0; i < attributes.getLength(); i++) {   
 
System.out.println(attributes.getQName(0)   
+ attributes.getValue(0));   
 
}   
 
}   
 
}   
 
public void characters(char[] ch, int start, int length)   
 
throws SAXException {   
 
System.out.println(new String(ch, start, length));   
 
}   
 
}  
package com.alisoft.facepay.framework.bean;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStream;  
import javax.xml.parsers.ParserConfigurationException;  
import javax.xml.parsers.SAXParser;  
import javax.xml.parsers.SAXParserFactory;  
import org.xml.sax.Attributes;  
import org.xml.sax.SAXException;  
import org.xml.sax.helpers.DefaultHandler;  
/** 
* 
* @author hongliang.dinghl 
* SAX  
*/  
public class SaxDemo implements XmlDocument {  
public void createXml(String fileName) {  
System.out.println("<<"+filename+">>");  
}  
public void parserXml(String fileName) {  
SAXParserFactory saxfac = SAXParserFactory.newInstance();  
try {  
SAXParser saxparser = saxfac.newSAXParser();  
InputStream is = new FileInputStream(fileName);  
saxparser.parse(is, new MySAXHandler());  
} catch (ParserConfigurationException e) {  
e.printStackTrace();  
} catch (SAXException e) {  
e.printStackTrace();  
} catch (FileNotFoundException e) {  
e.printStackTrace();  
} catch (IOException e) {  
e.printStackTrace();  
}  
}  
}  
class MySAXHandler extends DefaultHandler {  
boolean hasAttribute = false;  
Attributes attributes = null;  
public void startDocument() throws SAXException {  
System.out.println(" ");  
}  
public void endDocument() throws SAXException {  
System.out.println(" ");  
}  
public void startElement(String uri, String localName, String qName,  
Attributes attributes) throws SAXException {  
if (qName.equals("employees")) {  
return;  
}  
if (qName.equals("employee")) {  
System.out.println(qName);  
}  
if (attributes.getLength() > 0) {  
this.attributes = attributes;  
this.hasAttribute = true;  
}  
}  
public void endElement(String uri, String localName, String qName)  
throws SAXException {  
if (hasAttribute && (attributes != null)) {  
for (int i = 0; i < attributes.getLength(); i++) {  
System.out.println(attributes.getQName(0)  
+ attributes.getValue(0));  
}  
}  
}  
public void characters(char[] ch, int start, int length)  
throws SAXException {  
System.out.println(new String(ch, start, length));  
}  
}  
3.DOM4J XML 문서 생성 및 해석
DOM4J는 매우 우수한 Java XML API로 성능이 우수하고 기능이 강하며 사용하기 쉬운 특징을 가지며 오픈 소스 코드의 소프트웨어이기도 하다.오늘날 점점 더 많은 자바 소프트웨어들이 DOM4J를 사용하여 XML을 읽고 쓰는 것을 볼 수 있다. 특히 태양의 JAXM마저도 DOM4J를 사용하고 있다.

import java.io.File;   
import java.io.FileWriter;   
import java.io.IOException;   
import java.io.Writer;   
import java.util.Iterator;   
 
import org.dom4j.Document;   
import org.dom4j.DocumentException;   
import org.dom4j.DocumentHelper;   
import org.dom4j.Element;   
import org.dom4j.io.SAXReader;   
import org.dom4j.io.XMLWriter;   
/**  
*  
* @author hongliang.dinghl  
* Dom4j  XML XML   
*/  
public class Dom4jDemo implements XmlDocument {   
 
public void createXml(String fileName) {   
Document document = DocumentHelper.createDocument();   
Element employees=document.addElement("employees");   
Element employee=employees.addElement("employee");   
Element name= employee.addElement("name");   
name.setText("ddvip");   
Element sex=employee.addElement("sex");   
sex.setText("m");   
Element age=employee.addElement("age");   
age.setText("29");   
try {   
Writer fileWriter=new FileWriter(fileName);   
XMLWriter xmlWriter=new XMLWriter(fileWriter);   
xmlWriter.write(document);   
xmlWriter.close();   
} catch (IOException e) {   
 
System.out.println(e.getMessage());   
}   
 
 
}   
 
 
public void parserXml(String fileName) {   
File inputXml=new File(fileName);   
SAXReader saxReader = new SAXReader();   
try {   
Document document = saxReader.read(inputXml);   
Element employees=document.getRootElement();   
for(Iterator i = employees.elementIterator(); i.hasNext();){   
Element employee = (Element) i.next();   
for(Iterator j = employee.elementIterator(); j.hasNext();){   
Element node=(Element) j.next();   
System.out.println(node.getName()+":"+node.getText());   
}   
 
}   
} catch (DocumentException e) {   
System.out.println(e.getMessage());   
}   
System.out.println("dom4j parserXml");   
}   
}   
4. JDOM XML 생성 및 해석
DOM, SAX의 인코딩 양을 줄이기 위해 JDOM이 나타납니다.장점: 20-80 원칙으로 코드량을 크게 줄였다.사용 장소: 해석, 창설 등 간단하지만 밑바닥에서 JDOM은 SAX(최상용), DOM, Xanan 문서를 사용한다.

import java.io.FileNotFoundException;   
import java.io.FileOutputStream;   
import java.io.IOException;   
import java.util.List;   
 
import org.jdom.Document;   
import org.jdom.Element;   
import org.jdom.JDOMException;   
import org.jdom.input.SAXBuilder;   
import org.jdom.output.XMLOutputter;   
/**  
*  
* @author hongliang.dinghl  
* JDOM  XML   
*  
*/  
public class JDomDemo implements XmlDocument {   
 
public void createXml(String fileName) {   
Document document;   
Element root;   
root=new Element("employees");   
document=new Document(root);   
Element employee=new Element("employee");   
root.addContent(employee);   
Element name=new Element("name");   
name.setText("ddvip");   
employee.addContent(name);   
Element sex=new Element("sex");   
sex.setText("m");   
employee.addContent(sex);   
Element age=new Element("age");   
age.setText("23");   
employee.addContent(age);   
XMLOutputter XMLOut = new XMLOutputter();   
try {   
XMLOut.output(document, new FileOutputStream(fileName));   
} catch (FileNotFoundException e) {   
e.printStackTrace();   
} catch (IOException e) {   
e.printStackTrace();   
}   
 
}   
 
public void parserXml(String fileName) {   
SAXBuilder builder=new SAXBuilder(false);   
try {   
Document document=builder.build(fileName);   
Element employees=document.getRootElement();   
List employeeList=employees.getChildren("employee");   
for(int i=0;iElement employee=(Element)employeeList.get(i);   
List employeeInfo=employee.getChildren();   
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());   
 
}   
}   
} catch (JDOMException e) {   
 
e.printStackTrace();   
} catch (IOException e) {   
 
e.printStackTrace();   
}   
 
}   
}   
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기