linux命令执行解析xml,Linux环境下C使用的XML解析库:libxml2

D. XPath例程代码

#include

#include

xmlDocPtr

getdoc (char *docname) {

xmlDocPtr doc;

doc = xmlParseFile(docname);

if (doc == NULL ) {

fprintf(stderr,"Document not parsed successfully. \n");

return NULL;

}

return doc;

}

xmlXPathObjectPtr

getnodeset (xmlDocPtr doc, xmlChar *xpath){

xmlXPathContextPtr context;

xmlXPathObjectPtr result;

context = xmlXPathNewContext(doc);

result = xmlXPathEval;

if(xmlXPathNodeSetIsEmpty(result->nodesetval)){

printf("No result\n");

return NULL;

}

xmlXPathFreeContext(context);

return result;

}

int

main(int argc, char **argv) {

char *docname;

xmlDocPtr doc;

xmlChar *xpath = ("//keyword");

xmlNodeSetPtr nodeset;

xmlXPathObjectPtr result;

int i;

xmlChar *keyword;

if (argc <= 1) {

printf("Usage: %s docname\n", argv[0]);

return(0);

}

docname = argv[1];

doc = getdoc(docname);

result = getnodeset (doc, xpath);

if (result) {

nodeset = result->nodesetval;

for (i=0; i < nodeset->nodeNr; i++) {

keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->printf

("keyword: %s\n", keyword);

xmlFree(keyword);

}

xmlXPathFreeObject (result);

}

xmlFreeDoc(doc);

xmlCleanupParser();

return (1);

}

E. 添加keyword例程代码

#include

#include

#include

#include

#include

void

parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) {

xmlNewTextChild (cur, NULL, "keyword", keyword);

return;

}

xmlDocPtr

parseDoc(char *docname, char *keyword) {

xmlDocPtr doc;

xmlNodePtr cur;

doc = xmlParseFile(docname);

if (doc == NULL ) {

fprintf(stderr,"Document not parsed successfully. \n");

return (NULL);

}

cur = xmlDocGetRootElement(doc);

if (cur == NULL) {

fprintf(stderr,"empty document\n");

xmlFreeDoc(doc);

return (NULL);

}

if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {

fprintf(stderr,"document of the wrong type, root node != story");

xmlFreeDoc(doc);

return (NULL);

}

cur = cur->xmlChildrenNode;

while (cur != NULL) {

if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){

parseStory (doc, cur, keyword);

}

cur = cur->next;

}

return(doc);

}

int

main(int argc, char **argv) {

char *docname;

char *keyword;

xmlDocPtr doc;

if (argc <= 2) {

printf("Usage: %s docname, keyword\n", argv[0]);

return(0);

}

docname = argv[1];

keyword = argv[2];

doc = parseDoc (docname, keyword);

if (doc != NULL) {

xmlSaveFormatFile (docname, doc, 0);

xmlFreeDoc(doc);

}

return (1);

}

F. 添加属性例程代码

#include

#include

#include

#include

#include

xmlDocPtr

parseDoc(char *docname, char *uri) {

xmlDocPtr doc;

xmlNodePtr cur;

xmlNodePtr newnode;

xmlAttrPtr newattr;

doc = xmlParseFile(docname);

if (doc == NULL ) {

fprintf(stderr,"Document not parsed successfully. \n");

return (NULL);

}

cur = xmlDocGetRootElement(doc);

if (cur == NULL) {

fprintf(stderr,"empty document\n");

xmlFreeDoc(doc);

return (NULL);

}

if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {

fprintf(stderr,"document of the wrong type, root node != story");

xmlFreeDoc(doc);

return (NULL);

}

newnode = xmlNewTextChild (cur, NULL, "reference", NULL);

newattr = xmlNewProp (newnode, "uri", uri);

return(doc);

}

int

main(int argc, char **argv) {

char *docname;

char *uri;

xmlDocPtr doc;

if (argc <= 2) {

printf("Usage: %s docname, uri\n", argv[0]);

return(0);

}

docname = argv[1];

uri = argv[2];

doc = parseDoc (docname, uri);

if (doc != NULL) {

xmlSaveFormatFile (docname, doc, 1);

xmlFreeDoc(doc);

}

return (1);

}

G. 取得属性值例程代码

#include

#include

#include

#include

#include

void

getReference (xmlDocPtr doc, xmlNodePtr cur) {

xmlChar *uri;

cur = cur->xmlChildrenNode;

while (cur != NULL) {

if ((!xmlStrcmp(cur->name, (const xmlChar *)"reference"))) {

uri = xmlGetProp(cur, "uri");

printf("uri: %s\n", uri);

xmlFree(uri);

}

cur = cur->next;

}

return;

}

void

parseDoc(char *docname) {

xmlDocPtr doc;

xmlNodePtr cur;

doc = xmlParseFile(docname);

if (doc == NULL ) {

fprintf(stderr,"Document not parsed successfully. \n");

return;

}

cur = xmlDocGetRootElement(doc);

if (cur == NULL) {

fprintf(stderr,"empty document\n");

xmlFreeDoc(doc);

return;

}

if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {

fprintf(stderr,"document of the wrong type, root node != story");

xmlFreeDoc(doc);

return;

}

getReference (doc, cur);

xmlFreeDoc(doc);

return;

}

int

main(int argc, char **argv) {

char *docname;

if (argc <= 1) {

printf("Usage: %s docname\n", argv[0]);

return(0);

}

docname = argv[1];

parseDoc (docname);

return (1);

}

H. 编码转换例程代码

#include

#include

unsigned char*

convert (unsigned char *in, char *encoding)

{

unsigned char *out;

int ret,size,out_size,temp;

xmlCharEncodingHandlerPtr handler;

size = (int)strlen(in)+1;

out_size = size*2-1;

out = malloc((size_t)out_size);

if (out) {

handler = xmlFindCharEncodingHandler(encoding);

if (!handler) {

free(out);

out = NULL;

}

}

if (out) {

temp=size-1;

ret = handler->input(out, &out_size, in, &temp);

if (ret || temp-size+1) {

if (ret) {

printf("conversion wasn't successful.\n");

} else {

printf("conversion wasn't successful. converted: }

free(out);

out = NULL;

} else {

out = realloc(out,out_size+1);

out[out_size]=0; /*null terminating out*/

}

} else {

printf("no mem\n");

}

return (out);

}

int

main(int argc, char **argv) {

unsigned char *content, *out;

xmlDocPtr doc;

xmlNodePtr rootnode;

char *encoding = "ISO-8859-1";

if (argc <= 1) {

printf("Usage: %s content\n", argv[0]);

return(0);

}

content = argv[1];

out = convert(content, encoding);

doc = xmlNewDoc ("1.0");

rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out);

xmlDocSetRootElement(doc, rootnode);

xmlSaveFormatFileEnc("-", doc, encoding, 1);

return (1);

}

…………………………………………………………………………………………

char *convert(char *instr,char *encoding)

{

xmlCharEncodingHandlerPtr handler;

xmlBufferPtr in,out;

handler = xmlFindCharEncodingHandler(encoding);

if(NULL != handler)

{

in = xmlBufferCreate();

xmlBufferWriteChar(in,instr);

out = xmlBufferCreate();

if(xmlCharEncInFunc(handler, out, in)

{

xmlBufferFree(in);

xmlBufferFree(out);

return NULL;

}

else

{

xmlBufferFree(in);

return (char *)out-〉content;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值