C ++에서 국외 거주자 XML 파서를 사용하여 CDATA에서 탈출 된 기호 주위에 공백을 잃는다
-
19-09-2019 - |
문제
XML을 사용하여 응용 프로그램간에 프로젝트 정보를 보냅니다. 정보 중 하나는 프로젝트 설명입니다. 그래서 나는 가지고있다:
<ProjectDescription>Test & spaces around&some & amps!</ProjectDescription>
또는 : "테스트 및 공간 주변 및 일부 & 앰프!" <- 좋아!
그런 다음 국외 거주자를 사용하여 구문 분석하면 데이터 핸들러가 한 번에 전체 문자열의 일부만 가져옵니다. "테스트", 그런 다음 "&", "공백 주위", 다음 "&"등 등. 그런 다음 원래 문자열을 재구성하려고 할 때 데이터 핸들러가 절대 오지 않기 때문에 모든 간격이 삭제됩니다. 그들을보십시오. 그런 다음 XML을 다시 쓰면 다음과 같습니다.
<ProjectDescription>Test&spaces around&some&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 & YYY
char *와 길이 데이터 세트로 세 가지 이벤트가 있습니다.
char * = "XXX & YYY"
length = 4
char * = "&"
length = 1
char * = " YYY"
length = 4
따라서 공간이 유지됩니다. 내가 아는 한 사양 설정을 사용하지 않습니다. 어떤 버전의 국외 버전 및 플랫폼을 사용하고 있습니까?