参考网站:

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_nodepugi::xml_node用法的区别
  • node().value的用法还不是很懂,输出不了值??
  • auto& nsolid:solid_id_node后者是set集合,前者会变成pair

C++解析 xml,用到pugixml库的更多相关文章

  1. Ajax实现xml文件数据插入数据库(一)--- 构建解析xml文件的js库

    Ajax实现将xml文件数据插入数据库的过程所涉及到的内容比较多,所以对于该过程的讲解本人打算根据交互的过程将其分为三个部分,第一部分为构建解析xml文件的javascript库,第二部分为ajax与 ...

  2. iOS中解析 XML / JSON

    JSON数据格式 1. 概述: JSON (JavaScript Object Notation) 是⼀一种轻量级的数据交换格式 基于⽂文本格式,易于⼈人阅读和编写,同时也易于机器解析和⽣生成. 2. ...

  3. C++解析XML的通用库

    工作中,经常和XML打交道,最近抽空实现了一个通用解析XML的库,已归档在GitHub,详情点击:ComXmlLib.如果您无法访问GitHub,点击此处下载(链接是初版,无法和GitHub同步,如需 ...

  4. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  5. python优秀库 - 使用xmltodict解析xml文档

    上次讲到如何使用BeautifulSoup解析XML文档,今天发现另外一个python库xmltodict(https://github.com/martinblech/xmltodict)也很简单. ...

  6. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  7. 【javaweb学习】解析XML

    XML解析方式有两种 dom:Document Object Model文档对象模型,是w3c组织推荐的解析方式 sax:Simple Api XML不是官方标准,但它是XML社区实际上的标准,几乎所 ...

  8. SQL 存储过程 解析XML

    第一种说明: 我看过这样一篇文章,如下 在SQL   Server2005中,微软延续了   2000中一个特性(即支持XML类型的数据),并加强了对XML   数据列.XML变量以及XML索引的支持 ...

  9. MsXml创建和解析XML示例

    一.MsXml创建XML文档示例 // XmlCreationDemo.cpp #include <stdlib.h> #include <stdio.h> // 引入MSXM ...

  10. ACEXML解析XML文件——简单示例程序

    掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...

随机推荐

  1. 学习WPF——使用Font-Awesome图标字体(一)

    一.运行效果图 二.图标字体文件下载 http://fontawesome.dashgame.com/(这个网址可以下载图标字体文件) http://www.fontawesome.com.cn/(这 ...

  2. Flask中的模板语言jinja2

    jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ...

  3. HTML中的文本标签

    <span></span> 请使用 <span> 来组合行内元素,以便通过样式来格式化它们. 注释:span 没有固定的格式表现.当对它应用样式时,它才会产生视觉上 ...

  4. 小程序基础知识点讲解-WXML + WXSS + JS,生命周期

    小程序基础 小程序官方地址,小程序开发者工具,点击此处下载.在微信小程序中有一个配置文件project.config.json,此文件可以让开发者在不同设备中进行开发. 微信小程序共支持5种文件,wx ...

  5. nginx访问问题

    root响应的路径:配置的路径(root指向的路径)+完整访问路径(location的路径)+静态文件alias响应的路径:配置路径+静态文件(去除location中配置的路径)

  6. win10 + cuda8.0 + caffe SSD + vs2015 + python3

    一.下载 git clone https://github.com/runhang/caffe-ssd.git cd caffe-ssd 1. 修改 build_win.cmd if !PYTHON_ ...

  7. Selenium3 + Python3自动化测试系列一——安装Python+selenium及selenium3 浏览器驱动

    一.安装Python https://www.python.org/downloads/ 验证Python是否安装成功.打开Windows命令提示符(cmd),输入python,回车 注意:在安装的过 ...

  8. [EXP]Drupal < 8.6.10 / < 8.5.11 - REST Module Remote Code Execution

    Analyzing the patch By diffing Drupal and , we can see that in the REST module, FieldItemNormalizer ...

  9. 课程四(Convolutional Neural Networks),第四 周(Special applications: Face recognition & Neural style transfer) —— 1.Practice quentions

    [解释] This allows us to learn to predict a person’s identity using a softmax output unit, where the n ...

  10. oracle使用connect by进行级联查询 树型菜单

    Oracle使用connect by进行级联查询 树型菜单(转) connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点. 来看一个示例,现假设我们拥 ...