按属性查找 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();
我正在使用 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();