zoukankan      html  css  js  c++  java
  • 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_nodepugi::xml_node用法的区别
    • node().value的用法还不是很懂,输出不了值??
    • auto& nsolid:solid_id_node后者是set集合,前者会变成pair
  • 相关阅读:
    手写redux
    require.context
    webpack cdn加速
    spy-debugger安装、调试步骤
    MAC设置应用在127.0.0.1:80
    javascript数据结构——栈
    Immutable.js了解一下?
    自己搭建服务器.并返回结果
    vue-cli2与vue-cli3在一台电脑共存
    JavaScript点击事件-一个按钮触发另一个按钮
  • 原文地址:https://www.cnblogs.com/mingjiatang/p/9542881.html
Copyright © 2011-2022 走看看