여러 PC를 사용하는 프로그램에서 PC를 제어하기 위해, TCP 서버로 XML을 교환하려고 했다.

xml문을 전달하려고 하니, xml문서를 버퍼에 저장하고 반대로 버퍼에서 xml문서를 만드는 기능이 필요했다.

다행히 tinyxml2는 버퍼에 xml을 쓰거나, 버퍼의 xml을 읽어서 XMLDocument로 만드는 기능을 지원한다.  

 

아래 예제는 m_ServerInfos에 저장된 정보를 xml로 만들어 const char*로 받고,

반대로 const char*로부터 XMLDocument를 만드는 예제를 보여준다.

 

마지막 세줄을 제외하고는 그냥 xml 문서를 만드는 구문이다.

마지막 세줄이 버퍼에 xml을 출력하는 구문인데, XMLPrinter를 하나 만들어 여기다가 doc를 출력하면 된다.

그 다음 XMLPrinter의 CStr( )을 호출하면 xml문서의 const char* 포인터를 받을 수 있다.

문자열의 길이는 XMLPrinter::CStrSize를 호출하면 알 수 있다.

반대로 버퍼속의 xml문서를 객체로 만들기 위해서는 tinyxml2::XMLDocument::parse를 하면된다.

첫번째 파라미터는 xml문서의 포인터이고 두번째 파라미터는 문서 문자열의 길이다.

파싱된 xml로부터 이전의 IP주소가 정상적으로 출력되는 것을 볼 수 있다.

 

끝!

Posted by 굿쟌
,

컴퓨터 여러대로 동작하는 프로그램에서 다른 서버의 IP 정보를 XML로 저장해 두고 싶었다.

아래와 같이 TestEnvironment라는 Root element아래 서버정보를 기록해서 파일로 만들었다.

위 XML파일을 만드는데 사용한 코드는 아래와 같다.

어려울 것 없다.

새 element를 doc로 만들고, 상위 element의 LinkEndChild를 호출 해 만들어 놓은 element추가하면 된다.

attribute를 추가하고 싶으면 해당 elelment의 setAttribute를 호출 하면 된다.

비슷하게 text를 추가하고 싶으면 setText를 호출하면 된다.

 

XML파일을 파싱 할 때도 거의 비슷하다.

차이점이라면, element의 attribute를 불러 올 때 원하는 자료형으로 가져올 수 있다.

혹은 그냥 text로 받아오는 것도 가능하다.

위 코드에서, for문은 다음 sibling이 없을때 까지, 모든 sibling의 text와 "idx" atrribute를 받아온다.

NextSiblingElement함수를 호출하면 해당 XMLElement와 동일 레벨의 sibling들을 찾아올 수 있다.

만약 현재 xmlElement가 마지막 element라면 NextSiblingElement는 NULL을 반환한다.

 

Posted by 굿쟌
,

https://sourceforge.net/projects/tinyxml/

요기 들어가서 clone or download 눌러서 다운 받자. xinyxml2-master.zip이라는 파일로 다운된다.

최상위 폴더에 CMakeList가 있는걸 봐서 CMake도 지원하나보다.

Makefile이 있으니 리눅스 쓰시는 분들은 그냥 make로 빌드하시면 될듯..

근데 고맙게도 visual studio 2015버전 솔루션으로 바로 라이브러리를 빌드 할 수 있게 해놨다.

tinyxml2 폴더에 들어 가면 visual studio 2015 솔루션 파일이 한개 있다.

근데 내 컴퓨터에 visual studio 2015가 없어서 그냥 2010 솔루션 파일로 보인다.

visual studio 2010으로 열어도 변환 없이 그냥 열린다. 

뭔가 에러도 안나고, 변환도 안하고, 기분좋은 예감에 그냥 빌드하면 아래와 같은 에러를 만날 수 있다.

 

"error MSB8008: 지정된 플랫폼 도구 집합(v140)이 설치되지 않았거나 올바르지 않습니다."

왜냐면 나는 돈이 없어서 vs2015는 없으니까...

빌드하기 전에 아래와 같이 플랫폼 도구 집합을 변경해주자.

난 vs2010에서 코딩할 거라 도구집합을 v100으로 변경해서 빌드했다.

빌드가 다 되면, 메인폴더의 bin폴더 아래 빌드 구성에 따라 라이브러리가 생성된다.

 

빌드 구성은 아래 4개가 있으니까 쓰고 싶은 것 빌드해서 쓰면 된다.

Debug-Dll : 디버깅용 동적라이브러리

Debug-Lib : 디버깅용 정적라이브러리

Release-Dll: 릴리즈용 동적라이브러리

Release-Lib: 릴리즈용 정적라이브러리

 

참고로 솔루션에 프로젝트가 2개 들어가 있다.

한개는 라이브러리 빌드하는 프로젝트고 나머지 한개는 테스트용 프로그램..

둘다 빌드해 놓고 test프로그램을 실행시키면 dll이 없다고 실행이 안된다.

그냥 디버깅할 때, vs디버거가 사용하는 working 디렉토리가 아닌 곳에 dll이 생성되서 그런다.

 

만들어 놓은 test.exe와 dll을 그냥 모두 복사해서 tinyxml2.h 가 있는 폴더에다 옮겨보자.

그리고 test.exe를 실행시켜보자.

뭔가 콘솔이 잠깐 켜졌다가 꺼지는데 resources/out에 아래같이 파일이 생기면 성공한거다.

 

끝!

Posted by 굿쟌
,