RapidXML使用以前的属性值访问个别属性值?

时间:2013-07-16 17:28:07

标签: c++ xml parsing xml-parsing rapidxml

我在PC上使用VS2012中的rapidXML和C ++。我已经解析了XML文件,但现在我想单独打印出属性值。我通常可以使用下面的代码执行此操作。但是,此方法需要知道节点名称和属性名称。这是一个问题,因为我有多个具有相同名称的节点和多个具有相同名称的属性。 我的问题是,当节点名称和属性名称都不唯一时,如何获得单个属性值?

我拥有唯一节点名称和属性名称时使用的代码:

xml_node<> *node0 = doc.first_node("NodeName"); //define the individual node you want to access
xml_attribute<> *attr = node0->first_attribute("price"); //define the individual attribute that you want to access
cout << "Node NodeName has attribute " << attr->name() << " ";
cout << "with value " << attr->value() << "\n";

我的XML测试文件:

<catalog>
  <book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <price>44.95</price>
  </book>
  <book>
  <author>Ralls, Kim</author>
  <title>Midnight Rain</title>
  <price>5.95</price>
  </book>
</catalog>

对于这个具体的例子,如何在第二本书上获得price属性的值?我可以输入标题属性值“Midnight Rain”并以某种方式使用它来获取下一个值吗?

2 个答案:

答案 0 :(得分:1)

您可以使用next_sibling(const char *)成员函数迭代兄弟节点,直到找到具有正确属性值的节点。我没有测试过以下代码,但它应该知道你需要做什么:

typedef rapidxml::xml_node<>      node_type;
typedef rapidxml::xml_attribute<> attribute_type;

/// find a child of a specific type for which the given attribute has 
/// the given value...
node_type *find_child( 
    node_type *parent, 
    const std::string &type, 
    const std::string &attribute, 
    const std::string &value)
{
    node_type *node = parent->first_node( type.c_str());
    while (node)
    {
        attribute_type *attr = node->first_attribute( attribute.c_str());
        if ( attr && value == attr->value()) return node;
        node = node->next_sibling( type.c_str());
    }
    return node;
}

然后你可以通过调用:

找到第二本书
node_type *midnight = find_child( doc, "book", "title", "Midnight Rain");

获得该书的价格应该很容易。

一般来说,在处理rapidxml时,我倾向于创建许多这样的小辅助函数。我发现在没有xpath函数的情况下,它们使我的代码更容易阅读...

答案 1 :(得分:0)

当你说多个节点具有相同的名称和多个具有相同名称的属性时,你的意思是;多个节点和多个属性?如果是这种情况,那么我认为您正在尝试传递多个xml消息。但是,您应该能够首先传递第一个xml消息,然后成功传递第二个消息。你没有包含整个代码,我会首先检查doc.first_node方法是否实际创建了一个xml_node。