2015년 8월 6일 목요일

[C언어/C++] TinyXML

[C언어/C++] TinyXML

C++ XML Parser로 오픈소스이고 상용에 사용해도 무료다.
(NotePad++에서도 사용)

그리고 TinyXML-2도 있습니다.
1에 비해 가볍고 빠르다고 합니다.
(TinyXML-2 사용법은 다음에)

* C++ XML 라이브러리 소개

--- TinyXML 간단한 사용법
TinyXML v2.6.2, Visual Studio 2008로 테스트 했습니다.

1. lib
다운로드한 TinyXML을 컴파일하면 .lib가 생성되고 이것을 사용하면 됨.
하지만 VS 2008에서 컴파일이 안되서 이것도 다음에
2. .h, .cpp 추가
6개파일(tinystr.h, tinystr.cpp, tinyxml.h, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp)을
프로젝트에 추가하면 됨.

TinyXML 관련 6개 파일을 추가 후
#include "tinyxml.h" 선언

1. xml 만들기
위와 같은 간단한 xml 만들기

void CreateXml( void )
{
TiXmlDocument doc;

// 선언
TiXmlDeclaration* pDecl = new TiXmlDeclaration( "1.0", "euc-kr", "" );
doc.LinkEndChild( pDecl );

// Root Node
TiXmlElement* pRootNode = new TiXmlElement( "Root_Node" );
doc.LinkEndChild( pRootNode );

// A Node
TiXmlElement* pANode = new TiXmlElement( "A_Node" );
pRootNode->LinkEndChild( pANode );

TiXmlElement* pAElement1 =new TiXmlElement( "A_Element_1" );
pAElement1->LinkEndChild( new TiXmlText( "A Element 1 Text" ));
pANode->LinkEndChild( pAElement1 );

TiXmlElement* pAElement2 = new TiXmlElement( "A_Element_2" );
pAElement2->LinkEndChild( new TiXmlText( "A Element 2 Text" ));
pANode->LinkEndChild( pAElement2 );

// B Node
TiXmlElement* pBNode = new TiXmlElement( "B_Node" );
pRootNode->LinkEndChild( pBNode );
pBNode->SetAttribute( "Attribute", "Data" );
pBNode->SetAttribute( "int", 100 );
pBNode->SetDoubleAttribute("double", 123.45 ); // 소수점 입력

// C Node
TiXmlElement* pCNode = new TiXmlElement( "C_Node" );
pRootNode->LinkEndChild( pCNode );

TiXmlElement* pCElement = new TiXmlElement( "C_Element" );
pCElement->LinkEndChild( new TiXmlText( "C Element Text" ) );
pCNode->LinkEndChild( pCElement );

TiXmlElement* pCAttribute = new TiXmlElement( "C_Attribute" );
pCNode->LinkEndChild( pCAttribute );
pCAttribute->SetAttribute( "Attribute", "Data" );
pCAttribute->SetAttribute( "int", 100 );
pCAttribute->SetDoubleAttribute("double", 123.45 ); // 소수점 입력

// 주석
TiXmlComment* pComment = new TiXmlComment();
pComment->SetValue(" Comment " );
pRootNode->LinkEndChild( pComment );

// .xml 저장
doc.SaveFile("text.xml");
}

2. xml 읽기
void ReadXml( void )
{
// .xml 로드
TiXmlDocument doc;
doc.LoadFile( "text.xml" );
// 변수로 로드시
//char* Path = "text.xml";
//doc.Parse( Path );

// Root Node 접근
TiXmlElement* pRootNode = doc.FirstChildElement( "Root_Node" );
if ( NULL == pRootNode )
return;

// A_Node Type의 값 읽기
// 원하는 Node의 Element 접근 후 값 읽기
TiXmlElement* pANodeElem = pRootNode->FirstChildElement( "A_Node" )->FirstChildElement( "A_Element_1" );
if ( NULL == pANodeElem )
return;
const char* pszANode = pANodeElem->Value(); // pszNode=A_Element_1
const char* pszAText = pANodeElem->GetText(); // pszText=A Element 1 Text

// B_Node Type의 값 읽기
TiXmlElement* pBNodeElem = pRootNode->FirstChildElement( "B_Node" );
if ( NULL == pBNodeElem )
return;

// 방법 1
const char* psz1 = pBNodeElem->Attribute( "Attribute" ); // psz1=Data
const char* psz2 = pBNodeElem->Attribute( "int" ); // psz2=100
const char* psz3 = pBNodeElem->Attribute( "double" ); // psz3=123.45

// 방법 2
TiXmlAttribute* pAttribute = pBNodeElem->FirstAttribute();
const char* pszAttribute = pAttribute->Value(); // pszAttribute=Data

pAttribute = pAttribute->Next();
int nInt = pAttribute->IntValue(); // nInt=100

pAttribute = pAttribute->Next();
double ddouble = pAttribute->DoubleValue(); // ddouble=123.45
}

3. 수정
void WriteXml( void )
{
TiXmlDocument doc;
doc.LoadFile( "text.xml" );

// Root Node 접근
TiXmlElement* pRootNode = doc.FirstChildElement( "Root_Node" );
if ( NULL == pRootNode )
return;

// 삭제 후 새로저장
TiXmlElement* pCNodeElem = pRootNode->FirstChildElement( "C_Node" )->FirstChildElement( "C_Element" );
if ( NULL == pCNodeElem )
return;
pCNodeElem->Clear();
pCNodeElem ->LinkEndChild( new TiXmlText("Write_C_Element") );

// 수정 후 저장
TiXmlElement* pCNodeAttribute = pRootNode->FirstChildElement( "C_Node" )->FirstChildElement( "C_Attribute" );
if ( NULL == pCNodeAttribute )
return;
TiXmlAttribute* pAttribute = pCNodeAttribute->FirstAttribute();
pAttribute->SetValue( "Write_Data" );

pAttribute = pAttribute->Next();
pAttribute->SetIntValue( 200 );

pAttribute = pAttribute->Next();
pAttribute->SetDoubleValue( 567.89 );

doc.SaveFile( "text.xml" );
}

테스트파일 링크 겁니다.
http://cfile216.uf.daum.net/attach/2749493455C3159D1CD6E4

댓글 없음:

댓글 쓰기