여러 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 굿쟌
,