1. 기본 지식:
일반적으로 Java에서 XML을 구문 분석하는 방법에는 DOM, SAX, JDOM 및 DOM4J의 네 가지 방법이 있습니다.
2. 사용방법 소개
1) DOM
(1)소개
W3C(org.w3c.dom)에서 제공하는 인터페이스는 전체 XML 문서를 메모리로 읽어 들여 각 노드에서 작동할 DOM 트리를 구축합니다. 장점은 전체 문서가 항상 메모리에 있고 언제든지 모든 노드에 액세스할 수 있다는 것입니다. 트리 순회도 비교적 친숙한 작업입니다. 단점은 메모리를 소비하고 모든 문서를 메모리로 읽어올 때까지 기다려야 한다는 것입니다. 처리하기 전에.
(2) 샘플 코드:
다음과 같이 코드 코드를 복사합니다.
<?xml version="1.0" 인코딩="UTF-8" 독립형="아니요"?>
<루트>
<전화>
<유형 이름="노키아">
<가격>599</가격>
<연산자>CMCC</연산자>
</type>
<유형 이름="샤오미">
<가격>699</가격>
<operator>차이나넷</operator>
</type>
</전화>
</root>
다음과 같이 코드 코드를 복사합니다.
import java.io.ByteArrayOutputStream;
java.io.파일 가져오기;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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 가져오기;
org.xml.sax.InputSource 가져오기;
import org.xml.sax.SAXException;
공개 클래스 XMLHandler {
공개 XMLHandler(){
}
공개 문자열 createXML(){
문자열 xmlStr = null;
DocumentBuilderFactory 팩토리 = DocumentBuilderFactory.newInstance();
노력하다 {
DocumentBuilder 빌더 = Factory.newDocumentBuilder();
문서 문서 = builder.newDocument();
document.setXmlVersion("1.0");
요소 루트 = document.createElement("root");
document.appendChild(루트);
전화 요소 = document.createElement("TelePhone");
요소 nokia = document.createElement("type");
nokia.setAttribute("이름", "노키아");
요소 가격Nokia = document.createElement("가격");
가격Nokia.setTextContent("599");
nokia.appendChild(가격노키아);
요소 OperatorNokia = document.createElement("operator");
OperatorNokia.setTextContent("CMCC");
nokia.appendChild(operatorNokia);
Telephone.appendChild(노키아);
요소 샤오미 = document.createElement("type");
Xiaomi.setAttribute("이름", "샤오미");
요소 가격XiaoMi = document.createElement("가격");
가격XiaoMi.setTextContent("699");
샤오미.appendChild(priceXiaoMi);
요소 연산자XiaoMi = document.createElement("operator");
OperatorXiaoMi.setTextContent("ChinaNet");
샤오미.appendChild(operatorXiaoMi);
Telephone.appendChild(xiaomi);
root.appendChild(전화);
TransformerFactory transFactory = TransformerFactory.newInstance();
트랜스포머 transFormer = transFactory.newTransformer();
DOMSource domSource = 새로운 DOMSource(문서);
//문자열 내보내기
ByteArrayOutputStream bos = new ByteArrayOutputStream();
transFormer.transform(domSource, new StreamResult(bos));
xmlStr = bos.toString();
//-------
//파일로 저장
파일 file = new File("TelePhone.xml");
if(!file.exists()){
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(파일);
StreamResult xmlResult = 새로운 StreamResult(out);
transFormer.transform(domSource, xmlResult);
//---------
} catch (ParserConfigurationException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}catch(TransformerConfigurationException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}catch(TransformerException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}catch(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
xmlStr을 반환합니다.
}
공공 무효 파서XML(문자열 strXML){
DocumentBuilderFactory 팩토리 = DocumentBuilderFactory.newInstance();
노력하다 {
DocumentBuilder 빌더 = Factory.newDocumentBuilder();
StringReader sr = new StringReader(strXML);
입력소스는 = 새로운 입력소스(sr);
문서 문서 = builder.parse(is);
요소 rootElement = doc.getDocumentElement();
NodeList 전화 = rootElement.getElementsByTagName("유형");
for (int i = 0; i <phones.getLength(); i++) {
노드 유형 =phones.item(i);
String PhoneName = ((Element)type).getAttribute("name");
System.out.println("전화번호 = "+phoneName);
NodeList 속성 = type.getChildNodes();
for (int j = 0; j < Properties.getLength(); j++) {
노드 속성 = Properties.item(j);
문자열 nodeName = property.getNodeName();
if (nodeName.equals("가격")) {
문자열 가격=property.getFirstChild().getNodeValue();
System.out.println("price="+가격);
} else if (nodeName.equals("operator")) {
문자열 연산자=property.getFirstChild().getNodeValue();
System.out.println("operator="+operator);
}
}
}
} catch (ParserConfigurationException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}캐치(SAXException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
공개 정적 무효 메인(String[] args) {
XMLHandler 핸들러 = 새로운 XMLHandler();
문자열 xml = handler.createXML();
System.out.println(xml);
handler.parserXML(xml);
}
}
(3) Element와 Node의 차이점(org.w3c.dom)
Node 객체는 전체 문서 객체 모델의 주요 데이터 유형이며 DOM에서 가장 기본적인 객체이며 문서 트리의 추상 노드를 나타냅니다. 그러나 실제 사용에서는 Node 객체를 직접 사용하는 경우가 거의 없으며 대신 Node 객체의 하위 객체인 Element, Attr, Text 등을 사용합니다.
Element 객체는 HTML 또는 XML 문서의 요소를 나타내며 Node 클래스의 기본 하위 객체입니다. 요소에는 속성이 포함될 수 있으므로 Element에는 해당 속성에 액세스하기 위한 메서드가 있습니다.
요소는 Node에서 상속됩니다. 요소는 소규모 정의입니다. <div>...</div>와 같이 요소가 되려면 완전한 정보를 포함하는 노드여야 합니다. 그러나 노드가 반드시 요소일 필요는 없으며 요소는 노드여야 합니다.
노드에는 Element, Text, Attribute, RootElement, Comment, Namespace 등 여러 하위 유형이 있습니다.
2) 색소폰
3) JDOM
4) DOM4J
(1)소개
dom4j는 현재 최고의 XML 구문 분석입니다(Hibernate 및 Sun의 JAXM도 dom4j를 사용하여 XML을 구문 분석합니다). 이는 통합 XPath 지원, XML 스키마 지원 및 대규모 또는 스트리밍 문서의 이벤트 기반 처리를 포함하여 기본 XML 문서 표현 이상의 많은 기능을 통합합니다.
XPATH를 사용할 때 jaxen.jar을 추가하세요. 그렇지 않으면 다음 오류가 발생합니다.
다음과 같이 코드 코드를 복사합니다.
스레드 "main"의 예외 java.lang.NoClassDefFoundError: org/jaxen/JaxenException
org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)에서
org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)에서
org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
(2) 샘플 코드:
다음과 같이 코드 코드를 복사합니다.
java.io.파일 가져오기;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
java.util.List 가져오기;
org.dom4j.Document 가져오기;
import org.dom4j.DocumentException;
org.dom4j.DocumentHelper 가져오기;
org.dom4j.Element 가져오기;
org.dom4j.io.OutputFormat 가져오기;
org.dom4j.io.SAXReader 가져오기;
org.dom4j.io.XMLWriter 가져오기;
org.xml.sax.InputSource 가져오기;
공개 클래스 XMLHandler {
공개 XMLHandler() {
// TODO 자동 생성 생성자 스텁
}
공개 문자열 createXML(){
문자열 strXML = null;
문서 문서 = DocumentHelper.createDocument();
요소 루트 = document.addElement("root");
요소 전화 = root.addElement("TelePhone");
요소 nokia =phone.addElement("type");
nokia.addAttribute("이름", "노키아");
요소 가격_nokia = nokia.addElement("가격");
가격_노키아.addText("599");
요소 Operator_nokia = nokia.addElement("operator");
Operator_nokia.addText("CMCC");
요소 샤오미 =phone.addElement("type");
Xiaomi.addAttribute("이름", "샤오미");
요소 가격_xiaomi = Xiaomi.addElement("가격");
가격_xiaomi.addText("699");
요소 Operator_xiaomi = Xiaomi.addElement("operator");
Operator_xiaomi.addText("ChinaNet");
//---------
StringWriter strWtr = 새로운 StringWriter();
OutputFormat 형식 = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter =새 XMLWriter(strWtr, 형식);
노력하다 {
xmlWriter.write(문서);
} 잡기(IOException e1) {
// TODO 자동 생성된 캐치 블록
e1.printStackTrace();
}
strXML = strWtr.toString();
//---------
//-------
//strXML=document.asXML();
//------
//-------------
파일 file = new File("TelePhone.xml");
if (파일.존재()) {
파일.삭제();
}
노력하다 {
file.createNewFile();
XMLWriter out = new XMLWriter(새 FileWriter(파일));
out.write(문서);
out.flush();
종료.닫기();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
//-------------
strXML을 반환합니다.
}
공공 무효 파서XML(문자열 strXML){
SAXReader 리더 = 새로운 SAXReader();
StringReader sr = new StringReader(strXML);
입력소스는 = 새로운 입력소스(sr);
노력하다 {
문서 document = reader.read(is);
요소 루트 = document.getRootElement();
//요소 가져오기
List<Element> PhoneList = root.elements("TelePhone");
List<Element> typeList =phoneList.get(0).elements("type");
for (int i=0;i<typeList.size();i++){
요소 요소 = typeList.get(i);
String PhoneName = element.attributeValue("이름");
System.out.println("phonename = "+phoneName);
//모든 요소를 가져옵니다.
List<Element> childList = element.elements();
for (int j=0;j<childList.size();j++){
요소 e = childList.get(j);
System.out.println(e.getName()+"="+e.getText());
}
}
} 잡기(DocumentException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
공공 무효 파서XMLbyXPath(문자열 strXML){
SAXReader 리더 = 새로운 SAXReader();
StringReader sr = new StringReader(strXML);
입력소스는 = 새로운 입력소스(sr);
노력하다 {
문서 document = reader.read(is);
목록 목록 = document.selectNodes("/root/TelePhone/type");
for(int i=0;i<list.size();i++){
요소 e = (요소) list.get(i);
System.out.println("phonename="+e.attributeValue("이름"));
목록 list1 = e.selectNodes("./*");
for(int j=0;j<list1.size();j++){
요소 e1 = (요소) list1.get(j);
System.out.println(e1.getName()+"="+e1.getText());
}
}
} 잡기(DocumentException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
/**
* @param 인수
*/
공개 정적 무효 메인(String[] args) {
// TODO 자동 생성된 메서드 스텁
XMLHandler 핸들러 = 새로운 XMLHandler();
문자열 strXML=handler.createXML();
System.out.println(strXML);
handler.parserXML(strXML);
System.out.println("------------");
handler.parserXMLbyXPath(strXML);
}
}
5)XPATH
(1)소개
XPath는 XML 문서에서 정보를 찾는 언어입니다. XPath는 XML 문서의 요소와 속성을 탐색하는 데 사용됩니다.
구체적인 구문 소개는 http://w3school.com.cn/xpath/index.asp를 참조하세요.
(2) 샘플 코드:
다음과 같이 코드 코드를 복사합니다.
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
org.w3c.dom.Document 가져오기;
org.w3c.dom.Element 가져오기;
org.w3c.dom.Node 가져오기;
org.w3c.dom.NodeList 가져오기;
org.xml.sax.InputSource 가져오기;
import org.xml.sax.SAXException;
공개 클래스 XMLHandler {
공개 XMLHandler() {
// TODO 자동 생성 생성자 스텁
}
공공 무효 파서XML(문자열 strXML){
DocumentBuilderFactory 팩토리 = DocumentBuilderFactory.newInstance();
노력하다 {
DocumentBuilder 빌더 = Factory.newDocumentBuilder();
StringReader sr = new StringReader(strXML);
입력소스는 = 새로운 입력소스(sr);
문서 문서 = builder.parse(is);
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile("/root/TelePhone/type");
NodeList 전화 = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i <phones.getLength(); i++) {
노드 유형 =phones.item(i);
String PhoneName = ((Element)type).getAttribute("name");
System.out.println("전화번호 = "+phoneName);
XPathExpression expr1 = xpath.compile("./*");
NodeList 목록 = (NodeList) expr1.evaluate(type, XPathConstants.NODESET);
for(int j =0;j<list.getLength();j++){
요소 e1 = (요소) list.item(j);
System.out.println(e1.getNodeName()+"="+e1.getTextContent());
}
}
} catch (ParserConfigurationException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}캐치(SAXException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}catch(XPathExpressionException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
/**
* @param 인수
*/
공개 정적 무효 메인(String[] args) {
// TODO 자동 생성된 메서드 스텁
문자열 strXML="<?xml 버전=/"1.0/" 인코딩=/"UTF-8/" 독립형=/"no/"?>"+
"<루트>"+
"<전화>"+
"<유형 이름="nokia/">"+
"<price>599</price>"+
"<연산자>CMCC</연산자>"+
"</type>"+
"<type name="xiaomi/">"+
"<price>699</price>"+
"<operator>차이나넷</operator>"+
"</type>"+
"</TelePhone>"+
"</root>";
XMLHandler 핸들러 = 새로운 XMLHandler();
handler.parserXML(strXML);
}
}
추신: 다음은 참고용으로 XML 작업을 위한 몇 가지 온라인 도구입니다.
온라인 XML/JSON 변환 도구:
http://tools.VeVB.COm/code/xmljson
온라인 형식화 XML/온라인 압축 XML:
http://tools.VeVB.COm/code/xmlformat
XML 온라인 압축/형식 지정 도구:
http://tools.VeVB.COm/code/xml_format_compress