로컬 xml 파일을 읽고 DOM을 통해 구문 분석합니다. DOM 구문 분석의 특징은 전체 xml 파일을 메모리에 로드하여 DOM 트리 구조를 형성하는 것입니다. 탐색 및 조작이 편리합니다.
DOM 구문 분석의 특징은 xml 파일을 읽고 이를 DOM 트리 구조로 변환한 후 노드를 순회하는 것입니다.
이것이 W3c의 노드 개념이다
XML에 많은 양의 데이터가 포함되어 있는 경우 DOM은 XML을 메모리에 한 번에 로드하는 특성으로 인해 많은 양의 데이터가 포함된 XML을 구문 분석하는 데 적합하지 않습니다. 많은 양의 xml이 포함된 경우 SAX로 구문 분석하면 메모리가 절약됩니다.
다음은 DOM을 사용하여 xml 파일을 구문 분석하는 예입니다.
xml 파일 구조는 다음과 같습니다.
<?xml version="1.0" 인코딩="ISO-8859-1"?><서점> <book Category="cooking"> <title lang="en">일상 이탈리아어</title> <author>Giada De Laurentiis </author> <year>2005</year> <price>30.00</price> </book> <book Category="children"> <title lang="en">해리포터</title> <author>J K. 롤링</author> <year>2005</year> <price>29.99</price> </book> <book Category="web"> <title lang="en">XQuery 킥 스타트</title> <author>James McGovern</ 저자> <연도>2003</연도> <price>49.99</price> </book> <book Category="web" Cover="paperback"> <title lang="en">학습 XML</title> < 저자>에릭 T. 레이</author> <year>2003</year> <price>39.95</price> </book></bookstore>
다음과 같이 xml을 구문 분석하는 클래스를 만듭니다.
패키지 xml.dom;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org .w3c.dom.Node;import org.w3c.dom.NodeList;공개 클래스 ReadXmlFile { public static void main(String[] args) { try{ File xmlFile = new File("src/resource/book.xml") DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); 문서 문서 = builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("루트 요소: "+doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("book"); 0 ; i<nList.getLength();i++){ 노드 노드 = nList.item(i); System.out.println("노드 이름: "+ node.getNodeName()); Element ele = (Element)node("---------------- ------------"); if(node.getNodeType() == Element.ELEMENT_NODE){ System.out.println("책 카테고리: "+ ele.getAttribute("category")) ; System.out.println("제목 이름: "+ ele.getElementsByTagName("title").item(0).getTextContent()); System.out.println("저자 이름: "+ele.getElementsByTagName("author").item(0).getTextContent()); System.out.println("연도 :"+ele.getElementsByTagName("연도").item(0).getTextContent()); System.out.println("price : "+ele.getElementsByTagName("price").item(0).getTextContent() ); System.out.println("------------") } }
분석 결과:
루트 요소: 서점노드 이름: 책------------도서 범주: 요리제목 이름: Everyday Italian저자 이름: Giada De Laurentiis연도:2005가격:30.00 ------------노드 이름: book------ --- -------도서 카테고리: 어린이제목 이름: Harry Potter저자 이름: J K. Rowling연도:2005가격: 29.99---------- 노드 이름: book------------도서 카테고리: 웹타이틀 이름: XQuery Kick Startauthor 이름: James McGovern연도:2003가격: 49.99------------노드 이름: 책------------ ---------------도서 카테고리: 웹타이틀 이름: Learning XML저자 이름: Erik T. Ray연도:2003가격: 39.95------ --------
위의 내용은 이름을 통해 해당 값을 구하는 것입니다.
다음은 루프 노드를 사용하여 출력됩니다:
루프 노드 출력 모드의 코드는 다음과 같습니다.
패키지 xml.dom;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org .w3c.dom.Node;가져오기 org.w3c.dom.NodeList; public class ReadXmlFile2 { public static void main(String[] args) { try{ File xmlFile = new File("src/resource/book.xml") DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance() ; DocumentBuilder 빌더 = builderFactory.newDocumentBuilder(); builder.parse(xmlFile); doc.getDocumentElement().normalize(); System.out.println("루트 요소: "+doc.getDocumentElement().getNodeName()){ printNode (doc.getChildNodes()); } }catch(Exception e){ e.printStackTrace() } } 공개 정적 무효 printNode(NodeList nodeList){ System.out.println("------------") // System.out.println(nodeList. getLength()); for(int i = 0; i<nodeList.getLength(); i++){ 노드 노드 = (Node)nodeList.item(i); if(node.getNodeType() == Node.ELEMENT_NODE) System.out.println("노드 이름: "+node.getNodeName()); System.out.println("노드 값: "+node.getTextContent()){ NamedNodeMap nodeMap = node.getAttributes(); for(int j = 0; j < nodeMap.getLength(); j++){ 노드 nodenew = nodeMap.item(j); System.out.println("노드 이름 "+nodenew.getNodeName()); System.out.println("노드 값 "+nodenew.getNodeValue()); ()){ printNode(node.getChildNodes()) } } } }}
출력은 다음과 같습니다.
루트 요소: bookstore------------노드 이름: bookstore노드 값: Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 XQuery 시작하기 James McGovern 2003 49.99 XML 학습 Erik T. Ray 2003 39.95 -----노드 이름: booknode 값: Everyday Italian Giada De Laurentiis 2005 30.00 노드 이름 카테고리노드 값 요리----------노드 이름: titlenode 값: Everyday Italian노드 이름 langnode 값 en------- -----노드 이름: 작성자노드 값: Giada De Laurentiis------------------------- - 노드 이름: year노드 값: 2005------------노드 이름: 가격노드 값: 30.00------------ - ------------노드 이름: booknode 값: Harry Potter J K. Rowling 2005 29.99 node name 카테고리node value children------------노드 이름: titlenode value: Harry Potternode name langnode value en--------- ---노드 이름: 작성자노드 값: J K. Rowling------------------------- -------- 노드 이름: yearnode 값: 2005------------노드 이름: 가격node 값: 29.99---- -------- ------------노드 이름: booknode 값: XQuery Kick Start James McGovern 2003 49.99 노드 이름 Categorynode 값 web------------노드 이름: titlenode 값: XQuery Kick Start노드 이름 langnode 값 en--------- ---------------노드 이름: 작성자노드 값: James McGovern---------------노드 이름: yearnode 값: 2003------노드 이름: Pricenode 값: 49.99---- ----------- --------노드 이름: booknode 값: XML 학습 Erik T. Ray 2003 39.95 노드 이름 카테고리노드 값 webnode 이름 Covernode 값 paperback------------노드 이름: titlenode 값: 학습 XMLnode 이름 langnode 값 en--------- - ------------노드 이름: 작성자노드 값: Erik T. Ray---------------노드 이름 : yearnode 값: 2003------------노드 이름: Pricenode 값: 39.95--------------- - ----------
노드에 관한 질문:
<book Category="cooking"> <title lang="en">일상 이탈리아어</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </ 책>
도서 애플리케이션의 경우: doc.getChildNodes()는 NodeList의 길이가 9인 NodeList를 가져옵니다.
9개의 노드는 다음과 같습니다.
타이틀 노드
언어 노드
일상 노드
작성자 노드
Giada De Laurentiis 노드
연도 노드
2005년 노드
가격 노드
30.00노드