반응형
오늘 rapidxml 이라는 라이브러리를 사용했는데요. 이 라이브러리를 사용해서 xml 로 되어있는 문자열을 받은 정보를 c++ 로 해석을 해서 사용을 하려고 하였는데요. 이상하게도 사용할 수가 없었습니다. 한참을 헤메다가 알게된 사실은 바로.. 바로 아래의 예제에서 text 로 되어있는 부분에 char array 를 넣어야 하는데 제가 string 으로 넣어서 자꾸 에러가 난 것이었어요. 처음 xml 파싱을 하다보니 몇 시간을 그냥 날려 버렸네요ㅠ
using namespace rapidxml;
xml_document<> doc; // character type defaults to char
doc.parse<0>(text); // 0 means default parse flags
아래의 예제는 string 을 char array 로 변환하기 위한 샘플 예제 파일입니다. 요즘에는 strcpy 같은 명령어가 잘 않되는 것 같더라구요. 물론 제가 잘 몰라서 그럴수도 있는데요. 아무튼 손 쉽게 string -> char array 변환하는 방법을 소개합니다. 간단히 vector 를 이용하면 되더라구요.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str = "This is a string to char array example in c++";
vector<char> charArray(str.begin(), str.end());
charArray.push_back('\0');
char* charArrayPtr = &charArray[0];
cout << charArrayPtr << endl;
}
아래의 예제 소스는 rapidxml 을 적용한 소스코드의 일부인데요. req->responseData 이 변수가 바로 문자열(string) 입니다. 그 정보를 문자배열(char array)로 변환해서 저장을 하고 해당 배열로 rapidxml 에 넣어주니 정상적으로 변환이 되었습니다. rapidxml 의 print 함수를 이용하면 xml 의 전체 정보를 확인할 수가 있습니다.
#include "rapidxml.hpp";
#include "rapidxml_iterators.hpp"
#include "rapidxml_utils.hpp";
#include "rapidxml_print.hpp"
using namespace std;
using namespace rapidxml;
xml_document<char> xmlDoc;
std::vector<char> xmlData(req->responseData.begin(), req->responseData.end());
xmlData.push_back('\0');
char* xmlDataPtr = &xmlData[0];
xmlDoc.parse<0>(xmlDataPtr); // 0 means default parse flags
print(std::cout, xmlDoc, 0); // prints xmlDoc
char* node_name;
char* child_node_name;
char* node_value;
xml_node<char>* item;
xml_node<char>* subitem;
xml_node<char>* root = xmlDoc.first_node(); // first node of document, normally say root
xml_node<char>* area = root->first_node(); // child node of root node
for (item = root->first_node(); item; item = item->next_sibling()) { // area
for (subitem = item->first_node(); subitem; subitem = subitem->next_sibling()) { // x, y, w, h, type, result
node_name = subitem->name();
node_value = subitem->value();
cout << node_name << " = " << node_value << endl;
}
}
참고로 rapidxml 은 http://rapidxml.sourceforge.net 에서 확인 하실 수가 있습니다.
반응형
'IT News > C++' 카테고리의 다른 글
c++ 바이러리로 이미지 복사하기 visual studio 2008 (0) | 2015.01.22 |
---|---|
C++ MFC을 사용하여 picture control[픽처 컨트롤러]를 클릭하면 color picker [컬러픽커] 가 되도록 기능 구현 (0) | 2014.10.21 |
visual studio 2008 (다이얼로그 탭 순서 변경) dialog tap order change (0) | 2014.10.10 |