XML은 이제 보편적인 데이터 교환 형식이 되었습니다. 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" 인코딩="UTF-8"?>
<직원>
<직원>
<이름>ddviplinux</name>
<섹스>남</섹스>
<age>30</age>
</직원>
</직원>
이 기사에서는 JAVA 언어를 사용하여 XML 문서 생성과 DOM 및 SAX 구문 분석을 구현합니다.
먼저 XML 문서를 운영하기 위한 인터페이스인 XmlDocument를 정의합니다. XML 문서를 생성하고 구문 분석하기 위한 인터페이스를 정의합니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 com.alisoft.facepay.framework.bean;
/**
*
* @author hongliang.dinghl
* XML 문서 생성 및 구문 분석을 위한 인터페이스 정의
*/
공개 인터페이스 XmlDocument {
/**
* XML 문서 생성
* @param fileName 파일의 전체 경로 이름
*/
공공 무효 createXml(문자열 파일 이름);
/**
* XML 문서 구문 분석
* @param fileName 파일의 전체 경로 이름
*/
공공 무효 파서Xml(문자열 파일명);
}
1.DOM은 XML 문서를 생성하고 구문 분석합니다.
XML 문서의 구문 분석된 버전에 대해 인터페이스 세트가 정의됩니다. 파서는 전체 문서를 읽고 코드가 DOM 인터페이스를 사용하여 조작할 수 있는 메모리 상주 트리 구조를 구축합니다. 장점: 전체 문서 트리가 메모리에 있으므로 삭제, 수정, 재배열과 같은 다양한 기능을 지원합니다. 단점: 전체 문서를 메모리(쓸데없는 노드 포함)로 전송하면 시간과 공간이 낭비됩니다. 또한 이 데이터에 여러 번 액세스해야 합니다. 하드웨어 리소스(메모리, CPU)가 충분합니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 com.alisoft.facepay.framework.bean;
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;
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;
org.w3c.dom.Document 가져오기;
org.w3c.dom.Element 가져오기;
org.w3c.dom.Node 가져오기;
org.w3c.dom.NodeList 가져오기;
import org.xml.sax.SAXException;
/**
*
* @author hongliang.dinghl
* DOM 생성 및 XML 문서 구문 분석
*/
공개 클래스 DomDemo는 XmlDocument를 구현합니다.
개인 문서 문서;
개인 문자열 파일명;
공개 무효 초기화() {
노력하다 {
DocumentBuilderFactory 팩토리 = DocumentBuilderFactory
.newInstance();
DocumentBuilder 빌더 = Factory.newDocumentBuilder();
this.document = builder.newDocument();
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
}
}
공공 무효 createXml(문자열 파일 이름) {
요소 루트 = this.document.createElement("employees");
this.document.appendChild(루트);
요소 직원 = this.document.createElement("employee");
요소 이름 = this.document.createElement("name");
name.appendChild(this.document.createTextNode("Ding Hongliang"));
직원.appendChild(이름);
요소 섹스 = this.document.createElement("sex");
sex.appendChild(this.document.createTextNode("m"));
직원.appendChild(성별);
요소 연령 = this.document.createElement("age");
age.appendChild(this.document.createTextNode("30"));
직원.appendChild(나이);
root.appendChild(직원);
TransformerFactory tf = TransformerFactory.newInstance();
노력하다 {
변환기 변환기 = tf.newTransformer();
DOMSource 소스 = 새로운 DOMSource(문서);
Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
Transformer.setOutputProperty(OutputKeys.INDENT, "예");
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
StreamResult 결과 = new StreamResult(pw);
Transformer.transform(소스, 결과);
System.out.println("XML 파일이 성공적으로 생성되었습니다!");
} 잡기(TransformerConfigurationException e) {
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} 잡기(FileNotFoundException e) {
System.out.println(e.getMessage());
} 잡기(TransformerException e) {
System.out.println(e.getMessage());
}
}
공공 무효 파서Xml(문자열 파일 이름) {
노력하다 {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
문서 document = db.parse(fileName);
NodeList 직원 = document.getChildNodes();
for (int i = 0; i < Employees.getLength(); i++) {
노드 직원 = Employees.item(i);
NodeList 직원정보 = 직원.getChildNodes();
for (int j = 0; j < EmployeeInfo.getLength(); j++) {
노드 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("파싱 완료");
} 잡기(FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
} 잡기(SAXException e) {
System.out.println(e.getMessage());
} 잡기(IOException e) {
System.out.println(e.getMessage());
}
}
}
2.SAX는 XML 문서를 생성하고 구문 분석합니다.
DOM의 문제를 해결하기 위해 SAX가 등장했습니다. SAX, 이벤트 중심. 파서는 요소의 시작, 요소의 끝, 텍스트, 문서 등의 시작이나 끝을 찾으면 이벤트를 보내고, 프로그래머는 이러한 이벤트에 응답하는 코드를 작성하여 데이터를 저장합니다. 장점: 전체 문서를 미리 로드할 필요가 없으며 리소스를 덜 차지합니다. SAX 파서 코드는 DOM 파서 코드보다 작고 애플릿 및 다운로드에 적합합니다. 단점: 지속되지 않습니다. 데이터가 저장되지 않으면 상태가 유지되지 않습니다. 이벤트에서 텍스트만 얻을 수 있지만 해당 텍스트가 속한 요소는 알 수 없습니다. XML 문서 적은 양의 콘텐츠, 거의 재검토되지 않는 시스템 메모리.
자바 코드
다음과 같이 코드 코드를 복사합니다 .
패키지 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;
org.xml.sax.Attributes 가져오기;
import org.xml.sax.SAXException;
org.xml.sax.helpers.DefaultHandler 가져오기;
/**
*
* @author hongliang.dinghl
* SAX 문서 구문 분석
*/
공개 클래스 SaxDemo는 XmlDocument를 구현합니다.
공공 무효 createXml(문자열 파일 이름) {
System.out.println("<<"+파일 이름+">>");
}
공공 무효 파서Xml(문자열 파일 이름) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
노력하다 {
SAXParser saxparser = saxfac.newSAXParser();
InputStream은 = new FileInputStream(fileName);
saxparser.parse(is, new MySAXHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} 잡기(SAXException e) {
e.printStackTrace();
} 잡기(FileNotFoundException e) {
e.printStackTrace();
} 잡기(IOException e) {
e.printStackTrace();
}
}
}
MySAXHandler 클래스는 DefaultHandler를 확장합니다.
부울 hasAttribute = false;
속성 속성 = null;
public void startDocument()에서 SAXException이 발생합니다.
System.out.println("문서 인쇄가 시작되었습니다.");
}
public void endDocument()에서 SAXException이 발생합니다.
System.out.println("문서 인쇄가 종료되었습니다.");
}
공개 무효 startElement(문자열 uri, 문자열 localName, 문자열 qName,
속성 속성)은 SAXException을 발생시킵니다.
if (qName.equals("직원")) {
반품;
}
if (qName.equals("직원")) {
System.out.println(qName);
}
if (attributes.getLength() > 0) {
this.attributes = 속성;
this.hasAttribute = true;
}
}
공개 무효 endElement(문자열 uri, 문자열 localName, 문자열 qName)
SAXException 발생 {
if (hasAttribute && (속성 != null)) {
for (int i = 0; i < attribute.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ 속성.getValue(0));
}
}
}
공개 무효 문자(char[] ch, int start, int length)
SAXException 발생 {
System.out.println(new String(ch, start, length));
}
}
패키지 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;
org.xml.sax.Attributes 가져오기;
import org.xml.sax.SAXException;
org.xml.sax.helpers.DefaultHandler 가져오기;
/**
*
* @author hongliang.dinghl
* SAX 문서 구문 분석
*/
공개 클래스 SaxDemo는 XmlDocument를 구현합니다.
공공 무효 createXml(문자열 파일 이름) {
System.out.println("<<"+파일 이름+">>");
}
공공 무효 파서Xml(문자열 파일 이름) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
노력하다 {
SAXParser saxparser = saxfac.newSAXParser();
InputStream은 = new FileInputStream(fileName);
saxparser.parse(is, new MySAXHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} 잡기(SAXException e) {
e.printStackTrace();
} 잡기(FileNotFoundException e) {
e.printStackTrace();
} 잡기(IOException e) {
e.printStackTrace();
}
}
}
MySAXHandler 클래스는 DefaultHandler를 확장합니다.
부울 hasAttribute = false;
속성 속성 = null;
public void startDocument()에서 SAXException이 발생합니다.
System.out.println("문서 인쇄가 시작되었습니다.");
}
public void endDocument()에서 SAXException이 발생합니다.
System.out.println("문서 인쇄가 종료되었습니다.");
}
공개 무효 startElement(문자열 uri, 문자열 localName, 문자열 qName,
속성 속성)은 SAXException을 발생시킵니다.
if (qName.equals("직원")) {
반품;
}
if (qName.equals("직원")) {
System.out.println(qName);
}
if (attributes.getLength() > 0) {
this.attributes = 속성;
this.hasAttribute = true;
}
}
공개 무효 endElement(문자열 uri, 문자열 localName, 문자열 qName)
SAXException 발생 {
if (hasAttribute && (속성 != null)) {
for (int i = 0; i < attribute.getLength(); i++) {
System.out.println(attributes.getQName(0)
+ 속성.getValue(0));
}
}
}
공개 무효 문자(char[] ch, int start, int length)
SAXException 발생 {
System.out.println(new String(ch, start, length));
}
}
3.DOM4J는 XML 문서를 생성하고 구문 분석합니다.
DOM4J는 탁월한 성능, 강력한 기능 및 극도의 사용 편의성을 갖춘 매우 뛰어난 Java XML API입니다. 요즘에는 점점 더 많은 Java 소프트웨어가 DOM4J를 사용하여 XML을 읽고 쓰는 것을 볼 수 있습니다. 특히 Sun의 JAXM도 DOM4J를 사용하고 있다는 점은 언급할 가치가 있습니다.
자바 코드
다음과 같이 코드 코드를 복사합니다 .
패키지 com.alisoft.facepay.framework.bean;
java.io.파일 가져오기;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
org.dom4j.Document 가져오기;
import org.dom4j.DocumentException;
org.dom4j.DocumentHelper 가져오기;
org.dom4j.Element 가져오기;
org.dom4j.io.SAXReader 가져오기;
org.dom4j.io.XMLWriter 가져오기;
/**
*
* @author hongliang.dinghl
* Dom4j는 XML 문서를 생성하고 XML 문서를 구문 분석합니다.
*/
공개 클래스 Dom4jDemo는 XmlDocument를 구현합니다.
공공 무효 createXml(문자열 파일 이름) {
문서 문서 = DocumentHelper.createDocument();
요소 직원=document.addElement("직원");
요소 직원=employees.addElement("직원");
요소 이름=employee.addElement("name");
name.setText("ddvip");
요소 sex=employee.addElement("sex");
sex.setText("m");
요소 age=employee.addElement("age");
age.setText("29");
노력하다 {
작성기 fileWriter=새 FileWriter(파일 이름);
XMLWriter xmlWriter=새 XMLWriter(fileWriter);
xmlWriter.write(문서);
xmlWriter.close();
} 잡기(IOException e) {
System.out.println(e.getMessage());
}
}
공공 무효 파서Xml(문자열 파일 이름) {
파일 inputXml=새 파일(파일 이름);
SAXReader saxReader = 새로운 SAXReader();
노력하다 {
문서 document = saxReader.read(inputXml);
요소 직원=document.getRootElement();
for(Iterator i = Employees.elementIterator(); i.hasNext();){
요소 직원 = (요소) i.next();
for(Iterator j = Employee.elementIterator(); j.hasNext();){
요소 node=(요소) j.next();
System.out.println(node.getName()+":"+node.getText());
}
}
} 잡기(DocumentException e) {
System.out.println(e.getMessage());
}
System.out.println("dom4j 파서Xml");
}
}
4.JDOM은 XML을 생성하고 구문 분석합니다.
DOM 및 SAX의 코딩 양을 줄이기 위해 JDOM이 나타났습니다. 20-80 원칙은 코드 양을 크게 줄입니다. 사용 사례: 구현해야 할 기능은 구문 분석, 생성 등 간단하지만, 최하위 수준에서 JDOM은 여전히 SAX(가장 일반적으로 사용되는), DOM 및 Xanan 문서를 사용합니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 com.alisoft.facepay.framework.bean;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
java.util.List 가져오기;
org.jdom.Document 가져오기;
org.jdom.Element 가져오기;
import org.jdom.JDOMException;
org.jdom.input.SAXBuilder 가져오기;
org.jdom.output.XMLOutputter 가져오기;
/**
*
* @author hongliang.dinghl
* JDOM은 XML 문서를 생성하고 구문 분석합니다.
*
*/
공개 클래스 JDomDemo는 XmlDocument를 구현합니다.
공공 무효 createXml(문자열 파일 이름) {
문서 문서;
요소 루트;
root=new Element("직원");
document=새 문서(루트);
요소 직원=new 요소("직원");
root.addContent(직원);
요소 이름=새 요소("이름");
name.setText("ddvip");
직원.addContent(이름);
요소 sex=new 요소("성별");
sex.setText("m");
직원.addContent(성별);
요소 age=new Element("age");
age.setText("23");
직원.addContent(나이);
XMLOutputter XMLOut = new XMLOutputter();
노력하다 {
XMLOut.output(문서, 새 FileOutputStream(파일 이름));
} 잡기(FileNotFoundException e) {
e.printStackTrace();
} 잡기(IOException e) {
e.printStackTrace();
}
}
공공 무효 파서Xml(문자열 파일 이름) {
SAXBuilder 빌더=새 SAXBuilder(false);
노력하다 {
문서 document=builder.build(fileName);
요소 직원=document.getRootElement();
목록 EmployeesList=employees.getChildren("employee");
for(int i=0;iElement 직원=(Element)employeeList.get(i);
나열 EmployeeInfo=employee.getChildren();
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());
}
}
} 잡기(JDOMException e) {
e.printStackTrace();
} 잡기(IOException e) {
e.printStackTrace();
}
}
}