按属性查找 XML child

Find an XML child by an attribute

我正在使用 PugiXML 1.5 并试图在具有特定属性的巨人 XML 中找到特定的 child。具体来说,这个 XML 是一个 Collada DAE 文件。

我知道如何立即找到 child 即。通过这样做的属性:

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 搜索嵌套节点以检索 child 具有特定属性?

更新

我尝试了@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 url 但没有成功:

/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 是存在的单个节点。任何解释为什么我需要 //?

您可以使用 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();