C++解析 xml,用到pugixml库
参考网站:
https://www.cnblogs.com/haomiao/p/5041065.html
https://blog.csdn.net/iot_change/article/details/8496977
https://blog.csdn.net/sinat_35121480/article/details/54728594
待解析文件:
inputfile="StairWithRoomWithID.gml"
<bldg:interiorRoom>
<bldg:Room gml:id="2dQFggKBb1fOc1CqZDIDlx">
<gen:stringAttribute name="ID">
<gen:value>2dQFggKBb1fOc1CqZDIDlx</gen:value>
</gen:stringAttribute>
<gen:stringAttribute name="storey">
<gen:value>Level-2</gen:value>
</gen:stringAttribute>
<bldg:lod4MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:CompositeSurface>
<gml:surfaceMember>
<gml:Polygon gml:id="c4ee18347d0a489d8b5ba816ab6d046d">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">11.7 9.7 2.7 0.29999999999999893 9.7 2.7 0.29999999999999893 9.7 6.7 11.7 9.7 6.7 11.7 9.7 2.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
<gml:surfaceMember>
......
1、load_file(filename)
加载xml文件
pugi::xml_document doc;
if (!doc.load_file(ifile.c_str()))
{
cout << "Input file not found";
}
// pugi::xml_document作为文档类也作为DOM树的根节点类
2、select_nodes(str)
查找节点
localise(ss)="*[local-name(.) = '" + s + "']"
ss = "//" + localise("Room") + "[@" + localise("id") + "]";
pugi::xpath_node_set roomsolid = doc.select_nodes(ss.c_str());
//查找出全文中 有room名字且有id的 节点集,即文件中所有的<bldg:Room gml:id="2dQFggKBb1fOc1CqZDIDlx">的节点
3、node().attribute("gml:id").value()
查找节点属性为"gml:id"的值
map<std::string, pugi::xpath_node> solid_id_node;
for (pugi::xpath_node_set::const_iterator it = roomsolid.begin(); it != roomsolid.end(); ++it)
{
solid_id_node[it->node().attribute("gml:id").value()] = *it;
//将该节点的属性**gml:id**的id值,作为键值对中的键;而结点作为值
}
4、nsolid.second.node().name()
输出节点的结点名称
for (auto& nsolid:solid_id_node)
string ss = nsolid.second.node().name();//输出该节点的节点名称
//nsolid是一个键值对["id","结点"],即找出<bldg:Room gml:id="2dQFggKBb1fOc1CqZDIDlx">,中的"bldg:Room"
5、str1.find_first_of(str2)
提取上点中结点name中的有效值,如Room。该方法继承与String,返回的是从串str1中查找时str2,任何一个首次在str1中出现的位置,与find()
方法有所区别
string semantic;
std::size_t foundsempos = ss.find_first_of(":");//返回位置冒号的位置
if (foundsempos != std::string::npos) //pos为查找起始位置
{
semantic = ss.substr(foundsempos + 1);//提取冒号后的str
}
else
{
semantic = ss;
}
6、node().first_child()
找出当前node下的第一个子节点
pugi::xpath_node npo1 = nsolid.second.node().first_child();//找出第一个子节点
//结果为 <gen:stringAttribute name="ID">的结点
7、semantic = npo.node().text().as_string()
找出当前节点标签中的值,即gen:value18</gen:value>,输出的是18;
8、node().next_sibling()
找出当前节点同级的下一个节点;
9、pop_back()
向量容器vector的成员函数pop_back()可以删除最后一个元素。
10、./,../,/区别
./是当前目录;
../是父级目录
/是根目录
NOTE:
- 需要注意
pugi::xpath_node
和pugi::xml_node
用法的区别 node().value
的用法还不是很懂,输出不了值??auto& nsolid:solid_id_node
后者是set集合,前者会变成pair
C++解析 xml,用到pugixml库的更多相关文章
- Ajax实现xml文件数据插入数据库(一)--- 构建解析xml文件的js库
Ajax实现将xml文件数据插入数据库的过程所涉及到的内容比较多,所以对于该过程的讲解本人打算根据交互的过程将其分为三个部分,第一部分为构建解析xml文件的javascript库,第二部分为ajax与 ...
- iOS中解析 XML / JSON
JSON数据格式 1. 概述: JSON (JavaScript Object Notation) 是⼀一种轻量级的数据交换格式 基于⽂文本格式,易于⼈人阅读和编写,同时也易于机器解析和⽣生成. 2. ...
- C++解析XML的通用库
工作中,经常和XML打交道,最近抽空实现了一个通用解析XML的库,已归档在GitHub,详情点击:ComXmlLib.如果您无法访问GitHub,点击此处下载(链接是初版,无法和GitHub同步,如需 ...
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...
- python优秀库 - 使用xmltodict解析xml文档
上次讲到如何使用BeautifulSoup解析XML文档,今天发现另外一个python库xmltodict(https://github.com/martinblech/xmltodict)也很简单. ...
- 用 ElementTree 在 Python 中解析 XML
用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...
- 【javaweb学习】解析XML
XML解析方式有两种 dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式 sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所 ...
- SQL 存储过程 解析XML
第一种说明: 我看过这样一篇文章,如下 在SQL Server2005中,微软延续了 2000中一个特性(即支持XML类型的数据),并加强了对XML 数据列.XML变量以及XML索引的支持 ...
- MsXml创建和解析XML示例
一.MsXml创建XML文档示例 // XmlCreationDemo.cpp #include <stdlib.h> #include <stdio.h> // 引入MSXM ...
- ACEXML解析XML文件——简单示例程序
掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...
随机推荐
- 常用string格式化
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- 请教:WCF速度似乎比Remoting慢
两段极为相似的代码,主要想看看过输与序列化过程两者的用时差异,结果10000次的调用,WCF用了11秒多,remoting用了5秒不到!这是测试的源代码 Remoting的服务端 public cla ...
- Windows UDP sockets: recvfrom() fails with error 10054
https://stackoverflow.com/questions/34242622/windows-udp-sockets-recvfrom-fails-with-error-10054 #in ...
- Jenkins 集成Sonar代码质量扫描
Jenkins上安装插件 在jenkins插件安装界面安装: 插件名 SonarQube Scanner for Jenkins Jenkins上配置 jenkins中操作:系统管理-系统设置,找到 ...
- 线程间通信wait和notify【All】简介
1.通信就是指相互交换一些数据或者发送一些控制指令,比如一个线程给另一个暂停执行的线程发送一个恢复执行的指令. 可变共享变量是天然的通信媒介,也就是说一个线程如果想和另一个线程通信的话,可以修改某个在 ...
- 3-5 Vue中的样式绑定
Vue中的样式绑定: 本案例,简单设计一个<div>的点击绑定事件来改变div的样式效果 方法一:[class] ①(class和对象的绑定) //如上,运用class和一个对象的形式来解 ...
- 2019年2月编程语言最新排行:java稳居第一(java优势在哪里)
近日TIOBE公布了2月编程语言排名,在意料之中java稳居第一,C和C++分别位居第二第三名. 下图是2 月编程语言排行榜 TOP20 榜单以及前 10 名编程语言长期走势图: ...
- Python3学习笔记 - day1
前言 本文不是一篇系统的从零开始学习Python的教程,如果你需要从零开始学习Python,廖雪峰的官方网站中Python教程这部分将是比较好的一种选择,如果你英语比较好,也可以在国外的一些网站上找到 ...
- hashmap可以用null为键值
import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class TestMain { ...
- Git学习系列之Windows上安装Git详细步骤(图文详解)
前言 最初,Git是用于Linux下的内核代码管理.因为其非常好用,目前,已经被成功移植到Mac和Windows操作系统下. 鉴于大部分使用者使用的是Windows操作系统,故,这里详细讲解Windo ...