C ++에서 국외 거주자 XML 파서를 사용하여 CDATA에서 탈출 된 기호 주위에 공백을 잃는다

StackOverflow https://stackoverflow.com/questions/1900160

문제

XML을 사용하여 응용 프로그램간에 프로젝트 정보를 보냅니다. 정보 중 하나는 프로젝트 설명입니다. 그래서 나는 가지고있다:

<ProjectDescription>Test &amp; spaces around&amp;some  &amp;  amps!</ProjectDescription>

또는 : "테스트 및 공간 주변 및 일부 & 앰프!" <- 좋아!

그런 다음 국외 거주자를 사용하여 구문 분석하면 데이터 핸들러가 한 번에 전체 문자열의 일부만 가져옵니다. "테스트", 그런 다음 "&", "공백 주위", 다음 "&"등 등. 그런 다음 원래 문자열을 재구성하려고 할 때 데이터 핸들러가 절대 오지 않기 때문에 모든 간격이 삭제됩니다. 그들을보십시오. 그런 다음 XML을 다시 쓰면 다음과 같습니다.

<ProjectDescription>Test&amp;spaces around&amp;some&amp;amps!</ProjectDescription>

또는 : "테스트 및 공간 주위와 일부!" <- 나쁜!

이것은 기존 해결 방법에서 알려진 문제입니까? 탈출 된 기호 주위의 행동을 제어하기 위해 국외 거주자를 줄 수있는 설정이 있습니까?

답을 인터넷 검색하려는 시도는 불쾌한 실패에 충족되었습니다.

편집 : 의견의 질문에 대한 응답으로 : 나는 파서에 등록하는 내 자신의 핸들러가 있습니다.

parser=XML_ParserCreate(NULL); 
XML_SetUserData(parser,&depth);
XML_SetElementHandler(parser,startElement,endElement); 
XML_SetCharacterDataHandler(parser,dataHandler); 

핸들러는 다음과 같이 선언됩니다.

static void dataHandler(void *userData,const XML_Char *s,int l) 

그런 다음 "S"는 요소에 데이터를 포함합니다. "공백이있는 문자열"의 경우 열린 태그와 닫기 태그 사이의 전체 문자열입니다.

도움이 되었습니까?

해결책

방금 해외 거주자를 사용하는 내 라이브러리에서 테스트를 실행했습니다. 내 핸들러는 다음과 같이 보입니다. 디버그 진술이 진행되는 일을 표시합니다.

void CharDataHandler( void * parser, 
                       const XML_Char *s,
                       int len ) {
    std::cerr << "[" << s << "]\n";
    std::cerr << len << "\n";
    // my own processing here - not important 
}

나는 당신이 말하는 행동을 보지 못합니다. 입력 데이터의 경우 :

XXX &amp; YYY

char *와 길이 데이터 세트로 세 가지 이벤트가 있습니다.

char * = "XXX &amp; YYY"
length = 4

char * = "&"
length = 1

char * = " YYY"
length = 4

따라서 공간이 유지됩니다. 내가 아는 한 사양 설정을 사용하지 않습니다. 어떤 버전의 국외 버전 및 플랫폼을 사용하고 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top