基于libxml2与C语言处理OSM格式XML文件的技术问询
解析OSM格式XML的示例片段(C语言+libxml2场景)
先把你提供的OSM XML片段整理成带语法高亮的代码块,方便查看和后续处理:
<way id="9484424" visible="true" version="8" changeset="11179686" timestamp="2012-04-04T18:01:31Z" user="Davlak" uid="217070"> <nd ref="72843570"/> <nd ref="963203594"/> <nd ref="612588857"/> <nd ref="300164764"/> <nd ref="72843572"/> <tag k="highway" v="unclassified"/> <tag k="name" v="Via Giorgio Pitacco"/> <tag k="odbl" v="clean"/> <tag k="oneway" v="yes"/> </way> <way id="11378242" visible="true" version="29" changeset="22876351" timestamp="2014-06-11T18:00:17Z" user="Davlak" uid="217070"> <nd ref="101181728"/> <nd ref="2911704721"/> <nd ref="2911704714"/> <nd ref="101181731"/> <tag k="foot" v="yes"/> <tag k="highway" v="trunk_link"/> <tag k="lanes" v="2"/> <tag k="lit" v="yes"/> <tag k="maxspeed" v="40"/> <tag k="mofa" v="no"/> <tag k="moped" v="no"/> <tag k="motorroad" v="yes"/> <tag k="name" v="Circonvallazione Tiburtina"/> <tag k="oneway" v="yes"/> <tag k="sidewalk" v="right"/> </way> <way id="20507982" visible="true" version="11" changeset="17228559" timestamp="2013-08-05T14:00:29Z" user="Davlak" uid="217070"> <nd ref="219557958"/> <nd ref="1920238894"/> <nd ref="1701671630"/> <nd ref="1920238892"/> <nd ref="219557991"/> <tag k="highway" v="residential"/> <tag k="lit" v="yes"/> <tag k="name" v="Via Prenestina"/> </way> <way id="20507983" visible="true" version="14" changeset="26174383" timestamp="2014-10-18T17:12:55Z" user="Privits" uid="..."/>
结合你用C语言+libxml2处理的场景,给你几个实用的处理要点:
- 遍历
<way>节点:用xmlDocPtr加载文档后,通过xmlNodePtr从根节点开始遍历,筛选出节点名为way的元素 - 提取属性:比如要获取way的id,用
xmlGetProp(way_node, "id"),注意返回的字符串是libxml2分配的,用完要调用xmlFree()释放 - 处理子节点:每个
<way>下的<nd>和<tag>是子节点,可以循环遍历子节点,判断节点名来区分:- 遇到
nd节点时,提取ref属性获取节点引用ID - 遇到
tag节点时,分别提取k和v属性,得到标签的键值对(比如highway=unclassified这类信息)
- 遇到
- 大文件处理:OSM文件通常很大,建议用SAX解析器(
xmlSAXHandler)来流式处理,避免一次性加载整个文档到内存,提升效率
内容的提问来源于stack exchange,提问作者Claudio
相关产品推荐
相关产品推荐

