按属性

时间:2016-01-04 21:15:38

标签: collada pugixml

我正在使用PugiXML 1.5并尝试在具有特定属性的巨型XML中查找特定子项。具体来说,此XML是 Collada DAE 文件。

我知道如何找到一个直接的孩子,即。通过这样做的属性:

collada.child("library_visual_scenes").child("visual_scene").
child("node").find_child_by_attribute("instance_geometry", "url", "#myurl");

问题是library_visual_scenes可以完全具有这样的东西:

<library_visual_scenes>
   <visual_scene>
      <node>
      ...
         <node>
         ..
            <node>
               <instance_geometry url="this_is_what_i_want">
               ...

那么,不是编写明显的解析节点中的所有节点,而是有另一种find_child_by_attribute搜索到嵌套节点以检索具有特定属性的子节点吗?

更新

我尝试了@zeuxcg Xpath建议但仍然没有取给我节点。 HTML片段如下。我并不习惯 XPath (主要用于CSS查询)

...
<library_visual_scenes>
  <visual_scene id="xyzscene">
    <node name="EnvironmentAmbientLight">
      <instance_light url="#EnvironmentAmbientLight"/>
    </node>
    <node id="node-foo" name="foo">
      <instance_geometry url="#foo-url">
...

我尝试了以下Xpath网址但没有工作:

/library_visual_scenes/visual_scene//node/instance_geometry[@url='#foo-url']

但这有效:

//library_visual_scenes/visual_scene//node/instance_geometry[@url='#foo-url']

我了解到//表示搜索所有节点,但library_visual_scenes是现有的单个节点。任何解释为什么我需要//

1 个答案:

答案 0 :(得分:0)

您可以使用XPath:

doc.select_node("/library_geometries//geometry[@id='value']")

请注意,这会导致在整个子树中查找此节点;对于COLLADA,从一个字符串到另一个节点构建一次映射然后将其用于所有查找通常更有效。 IIRC ID必须是全局唯一的,因此您只需使用以下代码构建整个树的映射:

unordered_map<string, xml_node> map;

for (xpath_node item: doc.select_nodes("//@id"))
    map[item.attribute().value()] = item.parent();