1. 程式人生 > >xml的建立和解析

xml的建立和解析

   xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");

    xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST"root");

    //設定根節點

    xmlDocSetRootElement(doc,root_node);

    //在根節點中直接建立節點

  //  xmlNewTextChild(root_node, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content");

    //xmlNewTextChild(root_node, NULL, BAD_CAST "newNode2", BAD_CAST "newNode2 content");

//    xmlNewTextChild(root_node, NULL, BAD_CAST "newNode3", BAD_CAST "newNode3 content");

    //建立一個節點,設定其內容和屬性,然後加入根結點

//    xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2");

  //  xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT");

//    xmlAddChild(root_node,node);

  //  xmlAddChild(node,content);

  //  xmlNewProp(node,BAD_CAST"attribute",BAD_CAST "yes");

    //建立一個兒子和孫子節點

   xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "son1");

    xmlAddChild(root_node,node);

    xmlNodePtr grandson = xmlNewNode(NULL, BAD_CAST "om_alarm_id");

    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "3"));
    grandson = xmlNewNode(NULL, BAD_CAST "alarm_position");
    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "E:\\project\\test"));

    grandson = xmlNewNode(NULL, BAD_CAST "alarm_type");
    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "5"));





    node = xmlNewNode(NULL, BAD_CAST "son2");

    xmlAddChild(root_node,node);

    grandson = xmlNewNode(NULL, BAD_CAST "om_alarm_id");

    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "4"));
    grandson = xmlNewNode(NULL, BAD_CAST "alarm_position");
    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "E:\\project\\test\\libxml"));

    grandson = xmlNewNode(NULL, BAD_CAST "alarm_type");
    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "6"));



node = xmlNewNode(NULL, BAD_CAST "son3");

    xmlAddChild(root_node,node);

    grandson = xmlNewNode(NULL, BAD_CAST "om_alarm_id");

    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "5"));
    grandson = xmlNewNode(NULL, BAD_CAST "alarm_position");
    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "E:\\project\\test\\mcfddfa"));

    grandson = xmlNewNode(NULL, BAD_CAST "alarm_type");
    xmlAddChild(node,grandson);

    xmlAddChild(grandson, xmlNewText(BAD_CAST "1"));



    //儲存xml文件

    int nRel = xmlSaveFile("CreatedXml.xml",doc);

    if (nRel != -1)

    {

      // MessageBox("一個xml文件被建立,寫入個位元組");

    }

    //釋放文件內節點動態申請的記憶體

    xmlFreeDoc(doc);

解析

xmlDocPtr doc;           //定義解析文件指標

    xmlNodePtr curNode;      //定義結點指標(你需要它為了在各個結點間移動)

    xmlChar *szKey;          //臨時字串變數

    char *szDocName;
	char error[256]="";

    szDocName = "./CreatedXml.xml";

    doc = xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析檔案

    //檢查解析文件是否成功,如果不成功,libxml將指一個註冊的錯誤並停止。

    //一個常見錯誤是不適當的編碼。XML標準文件除了用UTF-8或UTF-16外還可用其它編碼儲存。

    //如果文件是這樣,libxml將自動地為你轉換到UTF-8。更多關於XML編碼資訊包含在XML標準中.

    if (NULL == doc)

    {  

      MessageBox("error");

     
    }

    curNode = xmlDocGetRootElement(doc); //確定文件根元素

   

    if (NULL == curNode)

    {

     
		MessageBox("error");
       xmlFreeDoc(doc);

      

    }

   

    if (xmlStrcmp(curNode->name, BAD_CAST "root"))

    {

      
       MessageBox("error");
       
		xmlFreeDoc(doc);

       

    }

    curNode = curNode->xmlChildrenNode;

    xmlNodePtr propNodePtr;

    while(curNode != NULL)

    {

       //取出節點中的內容
		memset(&alarm_reg,0x00,sizeof(alarm_reg));
		propNodePtr = curNode->xmlChildrenNode;
       if ((!xmlStrcmp(curNode->name, (const xmlChar *)"son")))

       {

           while(propNodePtr!=NULL)
		   {
		   if((!xmlStrcmp(propNodePtr->name,(const xmlChar *)"om_alarm_id")))
		   {
			szKey = xmlNodeGetContent(propNodePtr);
		//	sprintf(alarm_reg.alarm_id,"%s",(char*)szKey);
			sscanf((char*)szKey,"%s",alarm_reg.alarm_id);
			sprintf(error,"%s",alarm_reg.alarm_id);
			WRITE_LOG(error,LOG_TYPE_INFO,LOG_LEVEL_RUN,true);
			xmlFree(szKey);
		   }
		  
			if((!xmlStrcmp(propNodePtr->name,(const xmlChar *)"alarm_position")))
		   {
				 
				szKey = xmlNodeGetContent(propNodePtr);

			sscanf((char*)szKey,"%s",alarm_reg.alarm_picpath);
			sprintf(error,"%s",alarm_reg.alarm_picpath);
			WRITE_LOG(error,LOG_TYPE_INFO,LOG_LEVEL_RUN,true);
			//WRITE_LOG((char*)szKey,LOG_TYPE_INFO,LOG_LEVEL_RUN,true);

			xmlFree(szKey);
		   }
			 if((!xmlStrcmp(propNodePtr->name,(const xmlChar *)"alarm_type")))
		   {
				szKey = xmlNodeGetContent(propNodePtr);
			sscanf((char*)szKey,"%d",&alarm_reg.alarm_type);
			sprintf(error,"%d",alarm_reg.alarm_type);
			WRITE_LOG(error,LOG_TYPE_INFO,LOG_LEVEL_RUN,true);

				 

			xmlFree(szKey);
		   }
		   
		   propNodePtr=propNodePtr->next;
		 
		   
		   }
		   
		   //szKey = xmlNodeGetContent(curNode);

           
			
           

       }

       //查詢帶有屬性attribute的節點
/*
       if (xmlHasProp(curNode,BAD_CAST "attribute"))

       {

           propNodePtr = curNode;

       }
*/
       curNode = curNode->next;

    }

    //查詢屬性

 /*   xmlAttrPtr attrPtr = propNodePtr->properties;

    while (attrPtr != NULL)

    {

       if (!xmlStrcmp(attrPtr->name, BAD_CAST "attribute"))

       {

           xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "attribute");

           cout<<"get attribute = "<<szAttr<<endl;

           xmlFree(szAttr);

       }

       attrPtr = attrPtr->next;

    }
*/
    xmlFreeDoc(doc);

typedef struct DB_REG_ALARM_INFO_
{
	unsigned char alarm_id[64];
	unsigned int alarm_type; //報警型別
	unsigned char alarm_picpath[256];//報警圖片的位置

}DB_REG_ALARM_INFO,*DB_REG_ALARM_INFO_PTR;