- 论坛徽章:
- 0
|
1、将一组字符串儿拼接成一个xml消息的节点,之前的那个-<node></node>的“-”该用什么方法拼接?
我用strcpy(node,"-<"),结果成了这样
-
<node></node>,该用什么方法改回-<node></node>这种形式啊?谢谢各位
2、在程序中将xml文件看做一个文件操作,即每次写入时,在文件的准确长度减去strlen("</ptg-log>")的长度的位置处插入一个事先拼接好的xml节点。问题是,我可以写入节点,但是除了第一次是正确写入外,其他拼接后的xml节点信息全部不正确,两个节点信息之间出现大量的空格。程序如下:
#include <sys/fcntl.h>
#include <sys/unistd.h>
#include <sys/file.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
enum logtype{operation,error,excep};
struct flock* file_lock(short type, short whence)
{
static struct flock ret ;
ret.l_type = type ;
ret.l_start = 0 ;
ret.l_whence = whence ;
ret.l_len = 0 ;
ret.l_pid = getpid() ;
return &ret ;
}
int charNum=0,xmlfilefd;//统计文件程度和xmlfile 定义为全局变量。
class createXML
{
private:
// int xmlfilefd;
FILE *pFile;
char xmlbuf[];
public:
void createXMLHead();
int charNumber();
void createXMLNode(enum logtype lt,char messagedescription[200]);
void closeXMLFile();
};
void createXML::createXMLHead()
{
strcpy(xmlbuf,"<?xml version=\"1.0\"?>\n<ptg-log>\n</ptg-log>");
xmlfilefd = open("/root/xmltest/ptg_log.xml",O_WRONLY|O_CREAT,0644);
if(xmlfilefd<0)
{
perror("open xml file failed!");
} else {
cout<<"xml头文件创建成功!"<<endl;
write(xmlfilefd,xmlbuf,strlen(xmlbuf));
close(xmlfilefd);
}
}
int createXML::charNumber()
{
//以流的方式打开文件,统计文件中字符的个数
FILE *pFile = fopen( "/root/xmltest/ptg_log.xml", "r" );
char ch;
cout<<"ch equals ";
while ( (ch = getc( pFile )) != EOF )
{
charNum++ ;
cout<<ch;
}
cout<<endl;
//计算结束
fclose( pFile );
xmlfilefd = open("/root/xmltest/ptg_log.xml",O_WRONLY|O_CREAT,0644);
return charNum;
}
void createXML::createXMLNode(enum logtype lt,char messagedescription[200])
{
cout<<"createXML begin charNum value is : "<<charNum<<endl;
//取得当前时间
time_t t = time(0);
char tmp[30];
strftime( tmp, sizeof(tmp), "%Y-%m-%d %X",localtime(&t) );
string ss=tmp;
string s;
s= ss.substr(0,16);
//开始创建xml节点信息
char node[220];
char nodeName[20];
//char nodeDescription[200];
char nodeEnd[20];
strcpy(nodeEnd,">\n</ptg-log>");
switch(lt)
{
case 0:
strcpy(nodeName,"operation");
break;
case 1:
strcpy(nodeName,"error");
break;
case 2:
strcpy(nodeName,"excep");
break;
default:
cout<<"please choose a right node name"<<endl;
break;
}
//拼接成一个xml节点
strcpy(node,"<");
strcat(node,nodeName);
strcat(node," time=\"");
strcat(node,s.c_str());
strcat(node,"\">");
strcat(node,messagedescription);
strcat(node,"</");
strcat(node,nodeName);
strcat(node,nodeEnd);
//给文件加上操作锁
fcntl(xmlfilefd, F_SETLKW, file_lock(F_WRLCK, SEEK_SET));
int nodelength=strlen(node);
charNum = charNum-10;
lseek(xmlfilefd,charNum,SEEK_CUR);
write(xmlfilefd,node,strlen(node));
//对文件解锁操作
fcntl(xmlfilefd, F_SETLKW,file_lock(F_UNLCK,SEEK_END));
strcpy(node," ");
}
void createXML::closeXMLFile()
{
cout<<"end this file charNum value is : "<<charNum<<endl;
close(xmlfilefd);
}
class createNodeMessage
{
public:
char operationmessage[200];
char errormessage[200];
char exceptionmessage[200];
void callcreateXMLNode();
};
void createNodeMessage::callcreateXMLNode()
{
createXML callmessage;
enum logtype log;
for(int i=0;i<2;i++)
{
switch(i%3)
{
case 0:
log=operation;
strcpy(operationmessage,"this is an operation message !");
callmessage.createXMLNode(log,operationmessage);
break;
case 1:
log=error;
strcpy(errormessage,"this is an errormessage message !");
callmessage.createXMLNode(log,errormessage);
break;
case 2:
log=excep;
strcpy(exceptionmessage,"this is an exceptionmessage message !");
callmessage.createXMLNode(log,exceptionmessage);
break;
default:
cout<<"no input param"<<endl;
break;
}
}
}
int main()
{
createXML createxml;
createxml.createXMLHead();
createxml.charNumber();
createNodeMessage message;
//createxml.createXMLNode(l,message.operationmessage);
message.callcreateXMLNode();
createxml.charNumber();
createxml.closeXMLFile();
return 0;
}
结果是这样的:
<?xml version="1.0"?>
<ptg-log>
<operation time="2009-04-27 10:07">this is an operation message !</operation>
</ptg-log> <error time="2009-04-27 10:07">this is an errormessage message !</error>
</ptg-log>//这段节点信息本来应该插在蓝色的信息之前,但现在位置弄乱了!
各位辛苦了!谢谢指教!!
|
|