현재 저는 대형 XML 파일을 SQLite 백엔드로 처리해야하는 iPad 프로젝트를 진행하고 있습니다. 나는 현재이 작업을 TBXML 파서를 사용하고있다.iOS : SAX와 DOM 구문 분석을 결합하여
그래서 모든 논리가 제자리에 있고 일반적으로 TBXML 파서는 필요한 작업을 수행합니다. 지금 직면 한 문제는 XML 파일이 너무 커지고 메모리가 부족하다는 것입니다. 이 때문에 Alan Quatermain의 AQXMLParser과 같은 핵심 NSXMLParser와 같은 SAX 파서로 전환 할 생각입니다. 그러나 이것은 내가 DOM 트리가 제공하는 함수에 어느 정도 의존하는 현재의 모든 로직을 다시해야 할 것입니다. 이것은 내가하지 않을 일입니다.
그래서 내가 시도하고 싶은 것은 하이브리드 방식을 만드는 것입니다. 내 XML 구조를 감안할 때 이것이 가능해야합니다. 기본적으로 반복되는 "레코드"요소입니다. 각 레코드에는 반복되고 중첩 될 수있는 다양한 요소가 있습니다. 현재 나의 접근 방식에서는 문서를 구문 분석하고 각 레코드 요소를 데이터베이스로 처리하는 함수에 전달합니다. 이미 존재하는 것을 감안할 때 하이브리드 파싱 접근 방식에서이를 사용하고 싶습니다.
이것은 내가 달성하기를 원하는 것입니다. SAX 파서를 사용하여 문서를 트래버스합니다. 문서를 가로 지르는 동안 필자는 레코드 요소를 만듭니다. 레코드 요소를 완성 할 때마다 TBXML을 사용하는 기존 함수에 레코드 요소를 전달합니다. 그런 다음 SAX 파서는 다음 레코드 요소를 계속 작성합니다. 주요 목표는 다음과 같습니다. - 메모리 풋 프린트를 수정합니다 (가능한 한 작을 필요는 없지만 TBXML을 사용하는 경우 콘스탄트 또는 적어도 작아야합니다) - 성능을 유지하십시오. 다음과 같이
현재이를 구현하려면 :
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
//Recreate record string each time record element is encountered
if([elementName isEqualToString:@"Record"]) record = [[NSMutableString alloc] init];
//Write XML tag with name
[record [email protected]"<%@>, elementName];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//Write XML content
[record appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
//Write XML tag
[record [email protected]"</%@>, elementName];
if([elementName isEqualToString:@"Record"]){
//Parse record string into TBXML object
TBXML * tbxmlRecord = [TBXML tbxmlWithXMLString:record];
//Send it to the TBXML record processor
[self processElement:tbxmlRecord.rootXMLElement];
}
}
내가이 일을해야한다고 생각하지만, 문자열을 사용하는 더러운 느낌. 또한 파서가 새로운 레코드 요소에 도달 할 때 레코드 문자열이 너무 빨리 덮어 쓰이지 않을지에 대한 우려가 있습니다.
내 질문은 이것이 올바른 접근 방법인가, 아니면 내가 찾고있는 것을 성취 할 수있는 더 좋은 방법이 있다면?
편집 : 저는이 접근 방식을 구현했으며 매우 잘 작동합니다. 내가 마주 친 딸꾹질은 소스 파일이 UTF-8로 인코딩되어 있지 않으면 부분적인 결과 만 얻는다는 것입니다. 그러나 내가 이것을 고칠 때 모두 잘된다. 그래도 메모리 사용량은 그리 좋지 않습니다. 그러나 아마도 그것이 할 수있는 것을 취할 것입니다. 더 많은 테스트를 실행해야합니다 ...
코드에 오타가있는 것으로 보입니다. 코드를 업데이트 할 수 있습니까? 그것은 도움이 될 것입니다 – Chrizzz