从rapidxml:xmlnode获取子计数以获取随机子节点

时间:2014-12-08 00:05:49

标签: c++ xml rapidxml

我可以将我的XML文档文件转换为对象:

if(exists("generators.xml")) { //http://stackoverflow.com/a/12774387/607407
    rapidxml::file<> xmlFile("generators.xml"); // Open file, default template is char

    xml_document<> doc;               // character type defaults to char
    doc.parse<0>(xmlFile.data());;    // 0 means default parse flags
    xml_node<> *main = doc.first_node();  //Get the main node that contains everything
    cout << "Name of my first node is: " << doc.first_node()->name() << "\n";

    if(main!=NULL) {
        //Get random child node?
    }
}

我想从主要对象中选择一个随机子节点。我的XML看起来像这样(version with comments):

<?xml version="1.0" encoding="windows-1250"?>
<Stripes>
  <Generator>
     <stripe h="0,360" s="255,255" l="50,80" width="10,20" />
  </Generator>
  <Generator>
     <loop>
       <stripe h="0,360" s="255,255" l="50,80" width="10,20" />
       <stripe h="0,360" s="255,255" l="0,0" width="10,20" />
     </loop>
  </Generator>
</Stripes>

我想选择随机<Generator>条目。我认为让孩子计算是一种方法:

//Fictional code - **all** methods are fictional!
unsigned int count = node->child_count();
//In real code, `rand` is not a good way to get anything random
xmlnode<> *child = node->childAt(rand(0, count));

如何从rapidxml节点偏移子计数和子计划?

1 个答案:

答案 0 :(得分:1)

RapidXML使用链接列表存储DOM树,您知道这些链接列表不能直接索引。

因此,您基本上需要通过遍历节点子节点来自己实现这两种方法。像这样(未经测试的)代码。

int getChildCount(xmlnode<> *n)
{
  int c = 0;
  for (xmlnode<> *child = n->first_node(); child != NULL; child = child->next_sibling())
  {
    c++;
  } 
  return c;
} 

getChildAt显然是相似的。