자바 는 SAX 를 사용 하여 xml 의 예 를 해석 합 니 다.
SAX 는 Simple API for Xml 의 약자 로 xml 문 서 를 분석 하 는 데 사용 된다.이 방식 은 이벤트 구동(callback 리 셋 메커니즘)분석 방식 을 사용 하기 때문에 속도 가 빠 르 고 메모리 가 적은 장점 이 있 습 니 다.물론 이러한 장점 도 xml 의 읽 기 동작 에 국한 되 고 SAX 는 읽 기 XML 요 소 를 수정 할 수 없습니다.노드 요 소 를 수정 하려 면 DOC 방식 으로 xml 파일 을 읽 어야 합 니 다.xml 를 document 트 리 구조 대상 으로 읽 어서 노드 요 소 를 편집 할 수 있 습 니 다.DOC 방식 의 단점 도 뚜렷 하 다.메모리 가 크 고 해석 속도 가 느리다.
따라서 xml 작업 만 읽 고 SAX 방식 을 사용 하 는 것 이 좋 습 니 다.
2.SAX 분석 XML 인 스 턴 스
해 석 된 xml 파일 만 들 기
<?xml version="1.0" encoding="utf-8"?>
<persons>
<user>
<userId>1001</userId>
<userName> </userName>
</user>
<user>
<userId>1002</userId>
<userName> </userName>
</user>
</persons>
xml 분석 을 위 한 XML parseHandler 를 만 듭 니 다.
public class Customhandler extends DefaultHandler2 {
List<Map> list = new ArrayList<>();
Map map = null;
String tag = "";
@Override
public void startDocument() throws SAXException {
System.out.println(" xml");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(" : <"+ qName + ">");
if(qName == "user"){
map = new HashMap();
}
tag = qName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String text = new String(ch, start, length).trim();
if(text != null && !text.isEmpty() && tag!=null&& tag!=""){
map.put(tag, text);
if(!map.containsKey(tag)){
}
System.out.println(" :"+ text);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(" : <"+ qName + ">");
if(qName.equals("user")){
list.add(map);
}
tag = "";
}
@Override
public void endDocument() throws SAXException {
System.out.println(" xml");
}
}
SAX 분석 대상 분석 xml 만 들 기
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// xml
SAXParserFactory factory = SAXParserFactory.newInstance();
// xml
SAXParser parser = factory.newSAXParser();
File file = new File("test/custom/user.xml");
InputStream inputStream = new FileInputStream(file);
Customhandler customhandler = new Customhandler();
//
//parser.parse(inputStream, customhandler);
//
InputSource source = new InputSource(file.toURI().toURL().toString());
XMLReader xmlParser = parser.getXMLReader();
xmlParser.setContentHandler(customhandler);
xmlParser.parse(source);
List c = customhandler.list;
inputStream.close();
}
// :
xml
: <persons>
: <user>
: <userId>
:1001
: <userId>
: <userName>
:
: <userName>
: <user>
: <user>
: <userId>
:1002
: <userId>
: <userName>
:
: <userName>
: <user>
: <persons>
xml
3.SAX 의 실제 응용tomcat 소스 코드 에 Digester 대상 이 있 습 니 다.이 Digester 는 tomcat 가 시 작 될 때 각 용기(service,engine,Connetor)의 실행 자 를 초기 화 하 는 것 입 니 다.Digester 실행 용기 초기 화 근 거 는 설정 파일 server.xml 의 내용 을 분석 하고 xml 의 구체 적 인 설정 에 따라 용 기 를 초기 화 하 는 것 입 니 다.
다음은 Digester 류 의 주요 방법 입 니 다.
//org.apache.tomcat.util.digester.Digester#parse(org.xml.sax.InputSource)
public class Digester extends DefaultHandler2 {
// xml
public Object parse(InputSource input) throws IOException, SAXException {
configure();
getXMLReader().parse(input);
return root;
}
// xml , Rule
public void startElement(String namespaceURI, String localName, String qName, Attributes list)
throws SAXException {
boolean debug = log.isDebugEnabled();
// Parse system properties
list = updateAttributes(list);
// Save the body text accumulated for our surrounding element
bodyTexts.push(bodyText);
bodyText = new StringBuilder();
// the actual element name is either in localName or qName, depending
// on whether the parser is namespace aware
String name = localName;
if ((name == null) || (name.length() < 1)) {
name = qName;
}
// Compute the current matching rule
StringBuilder sb = new StringBuilder(match);
if (match.length() > 0) {
sb.append('/');
}
sb.append(name); // xml url
match = sb.toString();
// Fire "begin" events for all relevant rules( namespaceURI Rule , )
List<Rule> rules = getRules().match(namespaceURI, match);
matches.push(rules);
if ((rules != null) && (rules.size() > 0)) {
for (Rule value : rules) {
try {
Rule rule = value;
if (debug) {
log.debug(" Fire begin() for " + rule);
}
// begin
rule.begin(namespaceURI, name, list);
} catch (Exception e) {
log.error("Begin event threw exception", e);
throw createSAXException(e);
} catch (Error e) {
log.error("Begin event threw error", e);
throw e;
}
}
} else {
if (debug) {
log.debug(" No rules found matching '" + match + "'.");
}
}
}
}
이에 대응 하 는 server.xml 세 션 은 다음 과 같 습 니 다.
<Service name="Catalina">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
Digester 는 위 에 있 는 xml 탭 을 읽 으 면 외 향 적 으로 끼 워 넣 어 분석 합 니 다.이 탭 들 을 이에 대응 하 는 자바 류 인 스 턴 스,즉 tomcat 의 주체 용기 구조 로 만 듭 니 다.이상 은 자바 가 SAX 를 사용 하여 xml 를 분석 하 는 예제 의 상세 한 내용 입 니 다.자바 가 SAX 를 사용 하여 xml 를 분석 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.