gpt4 book ai didi

c++ - 使用 rapidxml 遍历节点

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:51 25 4
gpt4 key购买 nike

我是在 C++ 中使用 XML 的新手,我想遍历 XML 节点并将 的“id”属性打印到 vector 中。这是我的 XML

<?xml version="1.0" encoding="UTF-8"?>
<player playerID="0">
<frames>
<frame id="0"></frame>
<frame id="1"></frame>
<frame id="2"></frame>
<frame id="3"></frame>
<frame id="4"></frame>
<frame id="5"></frame>
</frames>
</player>

这就是我加载 XML 的方式

rapidxml::xml_document<> xmlDoc;

/* "Read file into vector<char>"*/
std::vector<char> buffer((std::istreambuf_iterator<char>(xmlFile)), std::istreambuf_iterator<char>( ));
buffer.push_back('\0');
xmlDoc.parse<0>(&buffer[0]);

如何遍历节点?

最佳答案

一旦将 xml 加载到文档对象中,就可以使用 first_node() 获取指定的子节点(或只是第一个);然后你可以使用 next_sibling() 遍历它所有的 sibling 。使用 first_attribute() 获取节点的指定(或仅第一个)属性。这是代码的样子:

#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include <rapidxml.hpp>
using std::cout;
using std::endl;
using std::ifstream;
using std::vector;
using std::stringstream;
using namespace rapidxml;

int main()
{
ifstream in("test.xml");

xml_document<> doc;
std::vector<char> buffer((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>( ));
buffer.push_back('\0');
doc.parse<0>(&buffer[0]);

vector<int> vecID;

// get document's first node - 'player' node
// get player's first child - 'frames' node
// get frames' first child - first 'frame' node
xml_node<>* nodeFrame = doc.first_node()->first_node()->first_node();

while(nodeFrame)
{
stringstream ss;
ss << nodeFrame->first_attribute("id")->value();
int nID;
ss >> nID;
vecID.push_back(nID);
nodeFrame = nodeFrame->next_sibling();
}

vector<int>::const_iterator it = vecID.begin();
for(; it != vecID.end(); it++)
{
cout << *it << endl;
}

return 0;
}

关于c++ - 使用 rapidxml 遍历节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9149974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com