我正在使用 boost 属性遍历 XML 文档 树并将结果存储在结构中。我的问题是我可以 只能到达第一个“项目”节点而不能访问第二个“项目” 节点。我希望有人能指出我在哪里犯了错误。
我的程序输出看起来像这样(你可以看到项目丢失了..那里 没有显示 cookie2、candy2 或 chocolate2 项目):
jar : snAcks
snack : coOkie
item : cooKie1
snack : canDy
item : caNdy1
snack : cHocolate
item : choColate1
这是 xml 文件:
<root>
<jar name="snAcks">
<snack name="coOkie">
<item name="cooKie1"></item>
<item name="cookIe2"></item>
</snack>
<snack name="canDy">
<item name="caNdy1"></item>
<item name="candY2"></item>
</snack>
<snack name="cHocolate">
<item name="choColate1"></item>
<item name="chocOlate2"></item>
</snack>
</jar>
</root>
这是源代码:
void parse_xml( boost::property_tree::iptree const& pt )
{
BOOST_FOREACH( boost::property_tree::iptree::value_type const& v, pt.get_child("root.jar") )
{
// Show jar
if ( boost::iequals( v.first, "<xmlattr>" ) )
{
std::cout << "jar : " << v.second.get<std::string>("NaME") << std::endl;
}
if ( boost::iequals( v.first, "snack" ) )
{
// Show snack
std::cout << "snack : " << v.second.get<std::string>("<xmlattr>.name") << std::endl;
try
{
BOOST_FOREACH( boost::property_tree::iptree::value_type const& val, v.second.get_child("item") )
{
if ( boost::iequals( val.first, "<xmlattr>" ) ) {
// Show item
std::cout << "item : " << val.second.get<std::string>("nAmE") << std::endl;
}
}
}
catch (boost::property_tree::ptree_bad_path& e)
{
// Show what caused exception
std::cout << "Exception: " << e.what() << std::endl;
}
}
}
}
感谢您花时间阅读本文。我想我做了一个简单的 错误,但不明白在哪里。
最佳答案
我想通了,但这不是我所说的直观的 xml 解析器库。
void parse_xml( boost::property_tree::iptree const& pt )
{
BOOST_FOREACH(boost::property_tree::iptree::value_type const& v, pt.get_child("root.jar"))
{
// Show jar
if ( boost::iequals( v.first, "<xmlattr>" ) ) {
std::cout << "jar : " << v.second.get<std::string>("NaME") << std::endl;
}
if ( boost::iequals( v.first, "snack" ) )
{
BOOST_FOREACH(boost::property_tree::iptree::value_type const& val, v.second)
{
// Show snack
if ( boost::iequals( val.first, "<xmlattr>" ) ) {
std::cout << "snack : " << val.second.get<std::string>("name") << std::endl;
}
if ( boost::iequals(val.first, "item") )
{
BOOST_FOREACH(boost::property_tree::iptree::value_type const& val2, val.second)
if ( boost::iequals( val2.first, "<xmlattr>" ) ) {
// Show item
std::cout << "item : " << val2.second.get<std::string>("nAmE") << std::endl;
}
}
}
}
}
}
如果比较这两个代码片段,您会发现我的代码片段结构更规则一些。
<xmlattr>节点关于xml - 遍历 boost 属性树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9216047/
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP
假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)