개발/java,spring
java xml 파싱 또다른 방법 sax 파싱
Mr.mandu.
2018. 10. 24. 14:42
이전에 DocumentBuilder 를 통해 xml 문서를 파싱한 포스팅을 하였습니다.
[개발/java,spring] - 자바 xml 데이터, 속성 파싱(java xml parsing data, attribute)
하지만 이 방식으로 할경우
Doctype 에 파일 정보(파일명, 경로 등)이 적혀있을경우 에러가 발생하였습니다.
그리하여 찾은 것이
Handler를 이용한 xml 파싱 방법 입니다.
xml 내용입니다.
홍길동 25 A B C 임꺽정 22 AA BB CC
그리고 바로 소스 첨부하겠습니다.
XMLParserHandler.java 파일을 생성하였습니다.
package lee.comm.util; import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XMLParserHandler extends DefaultHandler { private String elementName = ""; private StringBuffer sBuffer = new StringBuffer(); private ArrayListtagList = new ArrayList (); // XML 문서의 시작이 인식되었을 때 발생하는 이벤트를 처리 public void startDocument() { //System.out.println("Start Document"); } // XML 문서의 끝이 인식되었을 때 발생하는 이벤트를 처리 public void endDocument() { //System.out.println("End Document"); } // 엘리먼트의 시작을 인식했었을 때 발생하는 이벤트를 처리 public void startElement(String uri, String localName, String qname, Attributes attr) { elementName = qname; //element명을 멤버 변수에 넣어 둔다. int attrCount=attr.getLength(); // 태그 개수 String attrName=attr.getQName(0); // 첫번째 태그 임의 설정 String attrValue=attr.getValue(attrName); /* * 활용 예시 if(qname.equals("img")){ int attrCount=attr.getLength(); // 태그 개수 for(int i=0; i 9){ String file_nm = attrValue.substring(attrValue.lastIndexOf(".")-6); tagList.add(file_nm); } //System.out.println("속성값=============" + attrName+""+attrValue); } } } */ System.out.println("속성값=============" + attrName+"=="+attrValue); sBuffer.setLength(0); // buffer 초기화 } // 엘리먼트의 끝을 인식했었을 때 발생하는 이벤트를 처리 public void endElement(String uri, String localName, String qname) { System.out.println("End element, Name: " + qname); } // 각 element의 값 (인식된 문자의 각 세그먼트에 대해서 호출) public void characters(char[] ch, int start, int length) throws SAXException { String strValue = ""; // element의 값을 구하기 위해서는 buffer에 인식된 각 문자를 start에서 length만큼 append한다. sBuffer.append(new String(ch, start, length)); strValue = sBuffer.toString().trim(); if (strValue != null && strValue.length() != 0 && !strValue.equals("\n")) { System.out.println("elementName: " + elementName + ", strValue: "+ strValue); } } public ArrayList getTagList() { return tagList; } }
소스 끝에 </attrcount;></string></string> 이게 안지워지네요.. 지워서 사용하세요
사용 방법입니다.
File file = new File("src/main/webapp/resources/sample/xmlTest.xml"); SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setFeature("http://xml.org/sax/features/external-general-entities", false); spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); SAXParser sp = spf.newSAXParser(); XMLParserHandler parserHandler = new XMLParserHandler(); sp.parse(file, parserHandler); // Start Parsi ArrayListtagList = parserHandler.getTagList();
getTagList는 xml에서 추출한 값들을 따로 사용하기 위함 입니다.
설명들을 적는것보다 소스를 보시고
한번 돌려보시면 이해 될거라 생각됩니다.
아니면 댓글 주시면 성실히 답변드리겠습니다.
태그 및 속성값들이 확인되는 모습을 확인 할 수 있습니다.