我如何使用 libxml2 访问 <node > 中的 <tag key = ... value = .../>?

how can i access to <tag key = ... value = .../> which is IN a <node > using libxml2?

我正在尝试使用 libxml2 解析 OSM 文件。 这是 osm 文件的一部分:

   <node id="368138" lat="48.8546445" lon="2.3627305" user="Pieren"
    uid="17286" visible="true" version="3" changeset="4490579"
     timestamp="2010-04-21T20:34:49Z">
   <tag k="highway" v="traffic_signals"/>
   </node>

我需要获取标签的键和值。但我不知道如何。我尝试使用

访问
xmlHasProp(node,(const xmlChar*)"tag")

但我认为标签不被视为 node 的道具。

我不熟悉 libxml2,但根据文档 xmlHasProp() 搜索 XML 属性 。在OSM XML中,节点有各种属性,如latlon等。但是,标签并未建模为属性,而是子元素。要访问标签,您必须遍历节点的 children

最直接的选择是从根节点走到您要查找的后代节点。 XML 文档或元素的子节点可以通过 childrennext 指针作为链表访问。例如,假设 node 是一个 OSM node 元素:

for (xmlNode *cur = node->children; cur; cur = cur->next) {
    if (cur->type == XML_ELEMENT_NODE
        && xmlStrcmp(cur->name, BAD_CAST "tag") == 0) {
        /* Found "tag" element. */
    }
}

另一种选择是使用 libxml2 的 XPath 引擎。它允许您使用 XPath 表达式枚举节点。

查看 libxml2 网站上的 examples