Xml Node Àбâ ÀúÀå

TinyXmlÀ» ÀÌ¿ëÇØ ÆíÇÏ°Ô Xml Node¸¦ Àаí ÀúÀåÇغ¸ÀÚ.
±¸Çö ÀÚüÀÇ ¼³¸í º¸´Ù´Â XmlNodeÀÇ »ç¿ë¹ý¿¡ ´ëÇؼ­ ÀÚ¼¼ÇÏ°Ô ´Ù·ê°ÍÀÌ´Ù.

»ç¿ëµÇ´Â ±â´ÉÀº Å©°Ô TinyXmlÀ» ´Ù·ç´Â XmlNode¿Í ¹®ÀÚ¿­°ú ¼ýÀÚ º¯È¯À» ´Ù·ç´Â StringUtil ÇÔ¼öµéÀÌ´Ù.

 

<Xml³ëµå¿Í XmlÀÇ °ü°è>

XmlNode Ŭ·¡½º¸¦ Xml ±¸Á¶¿Í ºñ±³ÇØ º¸ÀÚ.

<?xml version="1.0" encoding="euc-kr" ?>
<root>
    <actor race="human">ö¼ö</actor>
</root>

xml version~~~ Çì´õ´Â ¹«½ÃÇÏ°í ³Ñ¾î°£´Ù.
<root> ~~ </root>¿Í <actor>  ~~ </actor>¸¦ XML¿ë¾î·Î "¿¤¸®¸ÕÆ®"¶ó ÇÑ´Ù.
ö¼ö´Â "¿¤¸®¸ÕÆ® ³»¿ë",  race="human"Àº ¼Ó¼ºÀ¸·Î race´Â "¼Ó¼ºÀ̸§", humanÀº "¼Ó¼º°ª"À̶ó ºÎ¸¥´Ù.

XmlNode¿¡¼­´Â "¿¤¸®¸ÕÆ®", "³»¿ë", "¼Ó¼ºÀ̸§", "¼Ó¼º°ª"¿¡ ´ëÇؼ­ ´Ù·é´Ù.

¿¤¸®¸ÕÆ® : ¿¤¸®¸ÕÆ®ÀÇ À̸§À» °¡Á®¿À°Å³ª ¼³Á¤ÇÑ´Ù. ¿©±â¼­´Â root³ª actor¸¦ ³ªÅ¸³½´Ù.
std::string*    XmlNode::GetName()
XmlNode&    XmlNode::SetName( const char* szName )

¿¤¸®¸ÕÆ® ³»¿ë: ¿¤¸®¸ÕÆ®ÀÇ ³»¿ëÀ» °¡Á®¿À°Å³ª ¼³Á¤ÇÑ´Ù. ¿©±â¼­´Â ö¼ö¸¦ ³ªÅ¸³½´Ù.
XmlNode&   XmlNode::SetData( std::string data )
XmlNode&   XmlNode::SetData( const char* pData )
std::string*    XmlNode::GetData()

¼Ó¼ºÀ̸§°ú ¼Ó¼º°ª: ¼Ó¼º À̸§°ú ¼Ó¼º°ªÀ» ¼³Á¤ÇÑ´Ù.
void  XmlNode::AddAttribute( const char* pName, const char* pValue )

 

<±âŸ Áß¿ä ¸Þ½îµå>

XmlNode¸¦ ¾îÅÂÄ¡Çϰųª µðÅÂÄ¡ ÇÒ ¼ö ÀÖ´Ù.
XmlNode* XmlNode::AttachChild( XmlNode* pChild )
void    XmlNode::DetachChild( XmlNode* pChild );

pName¿¡ ÇØ´çÇÏ´Â ¿¤¸®¸ÕÆ®¸¦ °Ë»öÇØ nodeArr ¹è¿­¿¡ Ãß°¡ÇÑ´Ù.
void XmlNode::FindNode( const char* pName, XmlNodeVector& nodeArr )

< XmlNodeÀÇ Àбâ, ÀúÀå, XmlNode »ý¼º>

XmlNode¸¦ ´Ù·ç´Â 3°¡Áö Àü¿ª ÇÔ¼ö°¡ ÀÖ´Ù.

XmlNode root¸¦ szNameÀ̶ó´Â À̸§À¸·Î Xml ÆÄÀÏÀ» ÀúÀåÇÑ´Ù.
void     WriteXml( const char* szName, XmlNode* root );

szName À̸§À» °¡Áø Xml ÆÄÀÏÀ» Àоî XmlNode*·Î ¸®ÅÏÇÑ´Ù. (XmlNode´Â ³ªÁß¿¡ delete ½ÃÄÑ Áà¾ßÇÑ´Ù.)
XmlNode*    ReadXml( const char* szName );

szNameÀ» ¿¤¸®¸ÕÆ® À̸§À¸·Î Á¤ÇÏ°í XmlNode¸¦ »ý¼ºÇÑ´Ù.
XmlNode*    CreateXmlNode( char* szName )

<¹®ÀÚ¿­ º¯È¯ ÇÔ¼öµé>

bool, float, Vector2, Vector3, Vector4, Matrix¸¦ ¹®ÀÚ¿­°ú »óÈ£ º¯È¯ ÇÒ ¼ö ÀÖ´Â ÇÔ¼ö ÀÌ´Ù.
À̵é ÇÔ¼ö¸¦ »ç¿ëÇؼ­ XmlNodeÀÇ ¿¤¸®¸ÕÆ®, ¿¤¸®¸ÕÆ® ³»¿ë, ¼Ó¼ºÀ̸§, ¼Ó¼º°ªÀ» Æí¸®ÇÏ°Ô Ã³¸® ÇÒ ¼ö ÀÖ´Ù.

bool            ToBool( const std::string& str );

std::string    ToString( bool bFlag );

int                ToInt( const std::string& str );

std::string        ToString( int num );

float            ToFloat( const std::string& str );

std::string        ToString( float num );

base::Vector2    ToVector2( const std::string& str );

std::string        ToString( const base::Vector2& vector );

base::Vector3    ToVector3( const std::string& str );

std::string        ToString( const base::Vector3& vector );

base::Vector4    ToVector4( const std::string& str );

std::string        ToString( const base::Vector4& vector );

base::Matrix    ToMatrix( const std::string& str );

std::string        ToString( const base::Matrix& mat );

 

<¿¹Á¦µé>

¾Æ·¡ ¿¹Á¦´Â 3d.xmlÀ» Àо 3d_test.xml ÆÄÀÏ·Î ÀúÀåÇÑ´Ù.

    XmlNode* pXmlNode = ReadXml( "3d.xml" );

    WriteXml( "3d_test.xml", pXmlNode );

    delete pXmlNode;

´ÙÀ½ ¿¹Á¦´Â bool, int, float, Vector2, Vetor3, Vector¸¦ ¿¤¸®¸ÓÆ®·Î ¸¸µé¾î  3d_type.xml ÆÄÀÏ·Î ÀúÀåÇÑ´Ù.

    XmlNode* rootXmlNode = CreateXmlNode( "root" );

 

    pXmlNode = new XmlNode;

    pXmlNode->SetName( "bool" ).SetData( ToString( true ) );

    bool bFlag = ToBool( *pXmlNode->GetData() );

    rootXmlNode->AttachChild( pXmlNode );

 

    pXmlNode = new XmlNode;

    pXmlNode->SetName( "Int" ).SetData( ToString( 10 ) );

    int num = ToInt( *pXmlNode->GetData() );

    rootXmlNode->AttachChild( pXmlNode );

 

    pXmlNode = new XmlNode;

    pXmlNode->SetName( "Float" ).SetData( ToString( 10.7f ) );

    float fnum = ToFloat( *pXmlNode->GetData() );

    rootXmlNode->AttachChild( pXmlNode );

 

    pXmlNode = new XmlNode;

    pXmlNode->SetName( "Vector2" ).SetData( ToString( base::Vector2( 2.2f, 2.3f ) ) );

    base::Vector2 vec2 = ToVector2( *pXmlNode->GetData() );

    rootXmlNode->AttachChild( pXmlNode );

 

    pXmlNode = new XmlNode;

    pXmlNode->SetName( "Vector3" ).SetData( ToString( base::Vector3( 1.2f, 2.4f, 3.5f ) ) );

    base::Vector3 vec = ToVector3( *pXmlNode->GetData() );

    rootXmlNode->AttachChild( pXmlNode );

 

    pXmlNode = new XmlNode;

    pXmlNode->SetName( "Vector4" ).SetData( ToString( base::Vector4( 1.1f, 2.2f, 3.3f, 4.4f ) ) );

    base::Vector4 vec4 = ToVector4( *pXmlNode->GetData() );

    rootXmlNode->AttachChild( pXmlNode );

 

    pXmlNode = new XmlNode;

    base::Matrix mat;

    mat.Init();

    for( int i = 1; i <= 4; ++i )

        for( int j = 1; j <= 4; ++j )

        {

            mat.m[i-1][j-1] = float(i*10 + j);

        }

    pXmlNode->SetName( "Matrix" ).SetData( ToString( mat ) );

    base::Matrix mat1 = ToMatrix( *pXmlNode->GetData() );

    rootXmlNode->AttachChild( pXmlNode );

    WriteXml( "3d_type.xml", rootXmlNode );

    delete rootXmlNode;

´ÙÀ½ÀÇ ¿¹Á¦´Â CreateXmlNode(), AttachChild(), AddAttribute(), FindNode()¸¦ »ç¿ëÇÑ ¿¹Á¦ÀÌ´Ù.

    rootXmlNode = CreateXmlNode( "root" );

 

    pXmlNode = CreateXmlNode( "Actor" );

    rootXmlNode->AttachChild( pXmlNode );

 

    pXmlNode->AddAttribute( "ö¼ö", "311" );

    pXmlNode->AttachChild( CreateXmlNode( "model" ) )->AttachChild( CreateXmlNode( "Vector" ) )->

            SetData( ToString(base::Vector3( 1.1f, 2.4f, 3.7f ) ) );

 

    rootXmlNode->AttachChild( CreateXmlNode("Actor") )->

            AttachChild( CreateXmlNode( "model" ) )->AttachChild( CreateXmlNode( "Vector" ) )->

            SetData( ToString(base::Vector3( 1, 2, 3 ) ) );

 

    XmlNodeVector nodeArr;

    rootXmlNode->FindNode( "root/Actor/model/Vector", nodeArr );

    if( nodeArr.empty() == false )

    {

        nodeArr[1]->AddAttribute( "type", "position" );

    }

 

    nodeArr.clear();

    rootXmlNode->FindNode( "root/Actor/model/Vector", nodeArr );

    if( nodeArr.empty() == false )

    {

        XmlNode* kXmlNode = nodeArr[0];

        base::Vector3 vec= ToVector3( *kXmlNode->GetData() );

        std::cout << "º¤ÅÍ Ãâ·Â" << std::endl;

    }

 

    WriteXml( "3d_math.xml", rootXmlNode );

    delete rootXmlNode;

ÇÁ·ÎÁ§Æ®: TinyXmlTest1.zip