/* 

xml 문서 작성하기 

*/



int main(int argc, char **argv)

{

    LIBXML_TEST_VERSION



xmlDocPtr doc;


xmlNodePtr rootNode;


xmlNodePtr prevNode;

xmlNodePtr subNode;


xmlChar* xmlData;


int size;


#define MY_XML_CHAR_ENCODING_UTF8  "utf-8"


// 생성될 xml 문서 정보를 지정한다.

doc = xmlNewDoc((xmlChar*)"1.0"); //1.0 버전으로 생성

doc->standalone = 1; 

doc->encoding = (const xmlChar*)MY_XML_CHAR_ENCODING_UTF8; 

doc->charset = 1;



// 문서에서 사용될 루트 노드를 지정한다

rootNode = xmlNewNode(NULL,(xmlChar*)"Packet"); //Packet라는 이름의 새 루트노드 생성

xmlDocSetRootElement(doc,rootNode); //rootNode를 Packet노드로 지정


subNode = xmlNewNode(NULL,(xmlChar*)"Data"); //Data라는 이름의 새 노드 생성


// 노드에 프로퍼티를 다음과 같이 추가할수 있다. <Data xmlns:xsd="http://www.w3.org/2001/XMLSchema"

//xmlNewProp(subNode, BAD_CAST "xmlns:xsd", BAD_CAST "http://www.w3.org/2001/XMLSchema");


// 다른방법

xmlSetProp(subNode, (xmlChar*)"test", (xmlChar*)"162");

xmlSetProp(subNode, (xmlChar*)"test2", (xmlChar*)"10009");

xmlAddChild(rootNode,subNode); //root노드에 sub노드를 단다.

 


// 루트노드가 아니라 이전노드 에 추가하려면 노드정보를 저장하고 xmlAddChild 할때 그노드를 지정하면 된다.

prevNode = subNode;

subNode = xmlNewNode(NULL,(xmlChar*)"Group");

xmlAddChild(prevNode, subNode);

prevNode = subNode;

subNode = xmlNewNode(NULL,(xmlChar*)"Tag");

xmlSetProp(subNode, (xmlChar*)"Name", (xmlChar*)"Park");

xmlSetProp(subNode, (xmlChar*)"TagValue", (xmlChar*)"100");

xmlAddChild(prevNode, subNode);


xmlDocDumpMemory(doc,&xmlData,&size); 


printf("%s\n",xmlData);

/* 출력 내용

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<Packet>

<Data test="162" test="10009">

<Tag Name="Park" TagValue="100">

</Tag>

</Data>

</Packet>

*/



doc->encoding = NULL;    

xmlFreeDoc(doc);


return 0;


}

Posted by 까만별사탕

댓글을 달아 주세요

/* 파싱할데이터 

<?xml version="1.0" encoding="utf-8" ?>

<Packet>

  <Data PacketKind="178" InvokeID="22212" MessageType="N" MessageIndex="1">    

    <Group>

      <Tag Name ="74" TagValue ="superadmin"/>

      <Tag Name ="97" TagValue ="1q2w3e"/>

      <Tag Name ="73" TagValue ="127.0.0.1"/>

    </Group>

  </Data>

</Packet>

*/


/*

szData는 '<' 시작해서  '>' 로 끝나야 한다. File을 읽을때 xmlReadFile를 사용하면 된다.

"noname.xml" 은 문서만들대 임의로 쓰일 이름이다.

NULL 로 지정하면 기본 utf-8 로 인식되어 진다.

다음인자는 parse 옵션 구조체가 전달되면 된다. 

*/



int xmlDataParse(char* szData)

{


    

LIBXML_TEST_VERSION


xmlDoc *doc;

xmlNode *root_element;


doc = xmlReadMemory(szData, nLen,"noname.xml", NULL, 0 );

//doc = xmlFileMemory("xml_packet.xml", NULL, 0 );

//doc = xmlParseMemory(szData, nLen);

if (doc == NULL) {

printf("error: xml read memeory %s\n");

LogMessage(hLog,8,"xmlReadMemory","Error \n");

return -1;

}


    

/*Get the root element node */

root_element = xmlDocGetRootElement(doc);

// 엘리먼트들을 파싱할 함수

parser_element_names(doc, root_element);


    /*free the document */

    xmlFreeDoc(doc);


    /*

     *Free the global variables that may

     *have been allocated by the parser.

     */


xmlCleanupParser();


xmlMemoryDump();


return 1;

}



// 각 엘리먼트의 이름을 구분한다.

void parser_element_names(xmlDocPtr doc, xmlNode * a_node)

{


xmlNode *cur_node = NULL;


for (cur_node = a_node; cur_node; cur_node = cur_node->next)

{

// cur_node->name 엘리먼트의 이름이다. 

if( cur_node->type == XML_ELEMENT_NODE /*&& (!xmlStrcmp(cur_node->name,(xmlChar*)"Group"))*/) { 

printf("Element: %s\n", cur_node->name); 

parser_item(doc, cur_node); 

parser_item2(doc, cur_node);

}

}

}


// 여기선 엘리먼트의 데이터 출력

void parser_item(xmlDocPtr doc, xmlNode * a_node)

{

xmlNode *cur_node = a_node->children;

xmlChar *key = NULL;

int i=0;

while(cur_node != NULL)

{

printf("cur_node->content:%s\n",cur_node->content);

printf("cur_node->name:%s\n",cur_node->name);

printf("cur_node->properties->name:%s\n",cur_node->properties->name);

if( cur_node->type == XML_ELEMENT_NODE && (!xmlStrcmp(cur_node->name, (const xmlChar *)"NAME")))

{

// 만약 NAME 라는 엘리먼트가 있다면 <NAME> test1234 </NAME> 에서 test1234 라는 문자가찍힌다.

key = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1);

printf("Key: %s",key);

}

}

}


// 여기선 엘리먼트의 프로퍼티 값 출력

void parser_item2(xmlDocPtr doc, xmlNode * a_node)

{

xmlNode *cur_node = a_node->children;

xmlChar *key = NULL;

int i=0;

for (; cur_node; cur_node = cur_node->next) 

{

//if( cur_node->type == XML_ELEMENT_NODE && (!xmlStrcmp(cur_node->name, (const         xmlChar*)"Tag")))

if( /*cur_node->type == XML_ELEMENT_NODE &&*/ (!xmlStrcmp(cur_node->name, (const xmlChar         *)"Tag")))

{

Get_element_Attribute_value(cur_node, cur_node->properties);

}

}


}


void Get_element_Attribute_value(xmlNode * a_node, struct _xmlAttr * pAtt)

{


printf( "name: %s \n", pAtt-> name);

printf("value:%s\n", xmlGetProp(a_node, pAtt->name));

if(pAtt->next != NULL)

{

Get_element_Attribute_value( a_node, pAtt->next);

}

return ;

}







Posted by 까만별사탕

댓글을 달아 주세요