C++解析 xml,用到pugixml庫

參考網站:html

https://www.cnblogs.com/haomiao/p/5041065.htmlnode

https://blog.csdn.net/iot_change/article/details/8496977c++

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>
              ......

一、load_file(filename)加載xml文件.net

pugi::xml_document doc;
if (!doc.load_file(ifile.c_str()))
{
    cout << "Input file not found";
}
    // pugi::xml_document做爲文檔類也做爲DOM樹的根節點類

二、select_nodes(str)查找節點code

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">的節點

三、node().attribute("gml:id").value()查找節點屬性爲"gml:id"的值xml

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值,做爲鍵值對中的鍵;而結點做爲值
}

四、nsolid.second.node().name()輸出節點的結點名稱htm

for (auto& nsolid:solid_id_node)
string ss = nsolid.second.node().name();//輸出該節點的節點名稱
//nsolid是一個鍵值對["id","結點"],即找出<bldg:Room gml:id="2dQFggKBb1fOc1CqZDIDlx">,中的"bldg:Room"

五、str1.find_first_of(str2)提取上點中結點name中的有效值,如Room。該方法繼承與String,返回的是從串str1中查找時str2,任何一個首次在str1中出現的位置,與find()方法有所區別blog

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;
}

六、node().first_child()找出當前node下的第一個子節點

pugi::xpath_node npo1 = nsolid.second.node().first_child();//找出第一個子節點
//結果爲 <gen:stringAttribute name="ID">的結點

七、semantic = npo.node().text().as_string()找出當前節點標籤中的值,即 18 ,輸出的是18;

八、node().next_sibling()找出當前節點同級的下一個節點;

九、pop_back()向量容器vector的成員函數pop_back()能夠刪除最後一個元素。

十、./,../,/區別

  • ./是當前目錄;

  • ../是父級目錄

  • /是根目錄

NOTE

  • 須要注意pugi::xpath_nodepugi::xml_node用法的區別
  • node().value的用法還不是很懂,輸出不了值??
  • auto& nsolid:solid_id_node後者是set集合,前者會變成pair
相關文章
相關標籤/搜索