热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux读xml文件内容,linux下使用libxml2库读写XML文件

一、安装libxml2库在linux对XML文件进行增、删、改、查,需要使用库libxml2我下载的文件是libxml2-2.6.30.tar.gz,将

一、安装libxml2库

在linux对XML文件进行增、删、改、查,需要使用库libxml2

我下载的文件是libxml2-2.6.30.tar.gz,将它放到到自己的Linux环境中,解压文件:

tar -xzvf libxml2-2.6.30.tar.gz

进入解压后的文件,依次输入命令安装:

./configure

make

make install

如果想检查安装效果可以输入命令:

make tests

卸载已安装的库可以输入命令

make uninstall

安装后的库,会被安放在两个地方:

*.h文件会被放到地址 /usr/local/include/libxml2/libxml

*.so文件会被放到地址 /usr/local/lib

二、源码一(a.cpp)

a.cpp建立了一个XML文档,根节点List,下面有2个Person,每个Person下有若干属性和若干Achievement作为子结点

#include

#include

#include

int main()

{

//建立XML文档和根结点

xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");

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

//将根节点绑定到XML文档

xmlDocSetRootElement(doc, root);

//建立Person结点,为其安装四个属性

xmlNodePtr nodeTsybius = xmlNewNode(NULL, BAD_CAST"Person");

xmlNewProp(nodeTsybius, BAD_CAST"Id", BAD_CAST"1001");

xmlNewProp(nodeTsybius, BAD_CAST"Name", BAD_CAST"Tsybius");

xmlNewProp(nodeTsybius, BAD_CAST"Sex", BAD_CAST"Male");

xmlNewProp(nodeTsybius, BAD_CAST"Age", BAD_CAST"23");

xmlAddChild(root, nodeTsybius);

//在Person结点下安放子结点,并为子节点添加内容

xmlNewTextChild(nodeTsybius, NULL, BAD_CAST"Achievement", BAD_CAST"ABC Rank 2");

xmlNewTextChild(nodeTsybius, NULL, BAD_CAST"Achievement", BAD_CAST"DEF Rank 4");

xmlNodePtr nodeGalatea = xmlNewNode(NULL, BAD_CAST"Person");

xmlNewProp(nodeGalatea, BAD_CAST"Id", BAD_CAST"1002");

xmlNewProp(nodeGalatea, BAD_CAST"Name", BAD_CAST"Galatea");

xmlNewProp(nodeGalatea, BAD_CAST"Sex", BAD_CAST"Female");

xmlNewProp(nodeGalatea, BAD_CAST"Age", BAD_CAST"21");

xmlAddChild(root, nodeGalatea);

xmlNewTextChild(nodeGalatea, NULL, BAD_CAST"Achievement", BAD_CAST"ABC Rank 1");

xmlNewTextChild(nodeGalatea, NULL, BAD_CAST"Achievement", BAD_CAST"XYZ Rank 2");

xmlNewTextChild(nodeGalatea, NULL, BAD_CAST"Achievement", BAD_CAST"MNOP Rank 5");

//保存XML文档

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

if(nRel != -1)

{

printf("List.xml: Created Successfully!\n");

}

//释放资源

xmlFreeDoc(doc);

xmlCleanupParser();

return 0;

}

三、源码二(b.cpp)

b.cpp对a.cpp中建立的XML文档进行修改

#include

#include

#include

#include

#define spc(level) PrintSpace(level)

//输出缩进用的空格(4个)

void PrintSpace(int level)

{

for(int counter = 0; counter

{

printf(" ");

}

}

//主函数

int main()

{

//打开XML文件

xmlDocPtr doc = xmlParseFile("List.xml");

if(doc == NULL)

{

printf("Error: Can not open List.xml\n");

exit(1);

}

//找到首结点

xmlNodePtr root = xmlDocGetRootElement(doc);

if(root == NULL)

{

printf("Error: Can not find the root!\n");

exit(1);

}

xmlNodePtr person; //Person结点指针

xmlNodePtr achivm; //Achievement结点指针

//遍历一个Person结点

spc(0); printf("Name: %s\n", root -> name);

person = root -> children;

//逐个找出属性

spc(1); printf("Node: %s\n", person -> name);

spc(2); printf("Id: %s\n", xmlGetProp(person, BAD_CAST "Id"));

spc(2); printf("Name: %s\n", xmlGetProp(person, BAD_CAST "Name"));

spc(2); printf("Sex: %s\n", xmlGetProp(person, BAD_CAST "Sex"));

spc(2); printf("Age: %s\n", xmlGetProp(person, BAD_CAST "Age"));

//用循环遍历子节点,打印内容

for(achivm = person -> children; achivm; achivm = achivm -> next)

{

spc(3);

printf("Node: %s\t", achivm -> name);

printf("Content: %s\t", (char*)xmlNodeGetContent(achivm));

printf("End\n");

}

spc(1); printf("End\n");

//一个Person结点遍历结束

//转到下一个Person结点

person = person -> next;

//查看某属性是否与某字符串相等

if(xmlStrcmp(xmlGetProp(person, BAD_CAST "Name"), (const xmlChar*)"Galate"))

{

spc(1); printf(">> The next person is Galatea!\n");

}

else

{

spc(1); printf(">> The next person is not Galatea!\n");

}

//查看某结点是否有某属性

if(xmlHasProp(person, BAD_CAST "Height"))

{

spc(1); printf(">> The node person has attribute: Height!\n");

}

else

{

spc(1); printf(">> The next person does not have attribute: Height!\n");

}

//修改属性(Attribute)

xmlSetProp(person, (const xmlChar*)"Age", (const xmlChar*)"22");

spc(1); printf(">> Change Galatea's age from 21 to 22!\n");

//修改子结点中的内容(Content)

xmlNodeSetContent(person -> children, (const xmlChar*) "NEW Rank 1");

spc(1); printf(">> Change Galatea's 1st achievement to NEW Rank 1\n");

//打印修改后的person结点

spc(1); printf("Node: %s\n", person -> name);

spc(2); printf("Id: %s\n", xmlGetProp(person, BAD_CAST "Id"));

spc(2); printf("Name: %s\n", xmlGetProp(person, BAD_CAST "Name"));

spc(2); printf("Sex: %s\n", xmlGetProp(person, BAD_CAST "Sex"));

spc(2); printf("Age: %s\n", xmlGetProp(person, BAD_CAST "Age"));

for(achivm = person -> children; achivm; achivm = achivm -> next)

{

spc(3);

printf("Node: %s\t", achivm -> name);

printf("Content: %s\t", (char*)xmlNodeGetContent(achivm));

printf("End\n");

}

spc(1); printf("End\n");

spc(0); printf("End\n");

xmlFree(achivm);

xmlFree(person);

xmlFree(root);

xmlFree(doc);

xmlCleanupParser();

return 0;

}

四、编译

在a.cpp和b.cpp同一个目录下建立一个文件compile.sh,内容如下:

#!/bin/sh

echo compiling...

g++ a.cpp -I/usr/local/include/libxml2 -L/usr/local/lib -lxml2 -o a

g++ b.cpp -I/usr/local/include/libxml2 -L/usr/local/lib -lxml2 -o b

echo run a...

./a

cat List.xml

echo run b...

./b

exit 0

在命令行中输入下面命令编译a.cpp和b.cpp

/bin/sh compile.sh

五、运行结果

318ea812ef8fd17b97321ac822f3d909.png

END

来源:oschina

链接:https://my.oschina.net/u/1425762/blog/309665



推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
author-avatar
PHPYeQ
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有