对于TinyXml这个工具,很久以前就使用过了,但是一直没抽出时间来记录下它的使用方法。孔子曰:温故而知新,可以为师矣。圣人的话总不会有错的,所以把原来做的项目代码翻出来记录下,供以后查看!
假设对于一个XML文档 a.xml
//加载XML文件 生成一个DOM树,返回TiXmlDocument对象
TiXmlDocument* par***ml::loadxmlfile(const char *path)
{
TiXmlDocument *my_document = new TiXmlDocument();
if(path)
{
bool res = my_document->LoadFile(path);
if(!res)
{
my_document->Clear();
res = my_document->LoadFile(path);
if(!res)
{
my_document->Clear();
if(path != NULL)
{
remove(path);
printf("remove the file %s\n",path);
}
return NULL;
}
}
}
return my_document;
} |
树已生成,经过上面的加载,就可以用返回的my_document对整个树进行相应的操作。加载树的目的,肯定是想从树中提取你想要的信息,再达成这个目的以前,需要对你感兴趣的数据在树中的位置进行定位,也就是遍历到你需要的节点上。
TiXmlElement* par***ml::findelement(const char *name, TiXmlElement *parent)
{
TiXmlElement *elem = NULL;
if(name == NULL || parent == NULL)
{
return NULL;
}
if(strcmp(name,parent->Value()) == 0)
{
return parent;
}
for(elem = parent->FirstChildElement(); elem;elem = elem->NextSiblingElement())
{
TiXmlElement *temp = NULL;
temp = findelement(name,elem);
if(temp)
{
return (TiXmlElement*)temp;
}
}
return NULL;
} |
这是个递归调用,参数name代表树节点,例如<姓名>张三姓名>,这里的姓名就是name了,parent代表父节点,也就是开始查找的节点。经过递归调用可以定位到你所需要的节点,剩下的就是取值了。
取值:
TiXmlElement *temp = findelement("title",elem);
if(temp == NULL)
{
elem = elem->NextSiblingElement();
continue;
}
memset(tempbuf,0,BUFLEN);
g2u((char*)temp->GetText(),strlen(temp->GetText()),tempbuf,2*strlen(temp->GetText()));
strncpy(item->title,tempbuf,strlen(tempbuf)) |
取属性值:
void par***ml::traversalopml(TiXmlElement *elem)
{
int i = 0;
OPML* temp;
temp = myopml;
TiXmlAttribute *att = elem->FirstAttribute();
TiXmlElement *tx = findelement("outline",elem->FirstChildElement());
while(tx != NULL)
{
att = tx->FirstAttribute();
do
{
if(strcmp(att->Name(),"text") == 0)
{
strcpy(temp->title,att->Value());;
}
else if(strcmp(att->Name(),"type") == 0)
{
strcpy(temp->type,att->Value());
}
else if(strcmp(att->Name(),"xmlUrl") == 0)
{
strcpy(temp->xml_url,att->Value());
printf("opml url:%s\n",temp->xml_url);
}
}while((att = att->Next()) != NULL);
temp->id = i;
OPML *op = new OPML();
temp->next = op;
temp = op;
i++;
tx = tx->NextSiblingElement();
}
} |
OK 大体上来说 就是那么简单!!
阅读(1452) | 评论(0) | 转发(0) |