2014-10-02 1 views
0

나는 C++에서 xml 리더를 사용하고 있으며 오류 기능을 수행 중이거나 완전한 xml 트리 만 파서에 보냅니다. 데이터는 다음C++ xml 청크 데이터 오류

String data(chunkdata); 

같은 문자열로 변환하고 데이터를 분석

char chunkdata[245]; 

같은 문자 배열입니다. 이 프로그램은 언제든지 청크 데이터를 처리합니다. 청크 데이터가있는 유일한 것은 그래서 나는 단지

<?xml version="1.0" encoding="UTF-8"?> 
<note> 
<to> Tove</to> 
<from>Jani</from> 
    <heading>Remin 

같은 문자 배열의 내용의 절반을 얻을 수 있습니다 그리고 나중에 나머지

을 몇 밀 초를 얻을 ... 가끔 불완전한 XML 트리를 보내는 것입니다
der</heading> 
<body>Don't forget me this weekend!</body> 
</note> 

처리 후 2 개의 문자열을 생성하고 프로그램을 중단시킵니다.

완료하지 않을 경우 추가를 기다리거나 전체 xml 트리 만 가져오고 남은 부분은 남겨두고 나머지는 그대로두고 코드에 추가 할 수있는 것이 있습니다 ... 문자열 찾기와 같은 작업을 시도했습니다. 처리 할 문자열 부분 문자열을 남은 나중에 추가하지만 작동하지 않았다 .. 어떤 제안 ??? 감사합니다.

+1

전체 파일을 문자열로로드 할 수있는 메모리가 충분하지 않으면 "내가 읽은 부분이 완전하지 않아서 다음 부분에서 계속합시다"유형 시나리오를 처리해야합니다. 한 번에 245, 3000 또는 9000자를 읽는다면 상관 없습니다. 어느 시점에서 처리해야합니다. –

답변

0

차단 모드에서 파일을 읽는 유효성 검사기 만 있다면 열려있는 태그와 닫힌 태그를 일종의 별도 구조로 추적해야합니다.

std::map<std::string, long> tags; 

을 그리고 때 발생할 : 당신의 버퍼 (나는 String이 무엇인지 모르겠지만, std::string 확실히 실행하는 동안 크기를 변경할 수 있습니다)의 길이를 변경할 수 있다면, 당신은 아마 다음과 같은 무언가를 갖고 싶어

if(tags.find(tagName)) 
    tags[tagName]++; 
else 
    tags[tagName]=1; 

을 그리고 당신은 태그 폐쇄가 발생할 때 수행 : 태그 개방, 할

if(tags.find(tagName)) 
    tags[tagName]--; 
else 
    tags[tagName]=-1; 

태그가 닫혀 제대로 경우에만 모든 ELEM 지도의 텐트는 0입니다. testForCorrectness()이라고 가정하면됩니다. 그런 다음 코드는 다음과 같습니다

char chunkdata[245]; 
readSomeData(); 
String data(chunkdata); 
while(!testforCorrectness()){ 
    readSomeData(); 
    data += (String)chunkdata; 
} 
return chunkdata; 

을 당신은 또한 태그가 올바른 순서로 폐쇄 된 경우 테스트 할 경우 - vector 대신 사용해보십시오 : 태그에

std::vector<std::string> openedTags; 

시작 :

를 태그 가까이에
openedTags.push_back(tagName); 

:

if(openedTags.back() == tagName) 
    openedTags.pop_back(); 
else 
    // XML is ill-formed 
,

마치면 empty(openedTags).