解析GML文件(来自shp一个)C

问题描述:

我的问题是,使用ogr2​​ogr,我将一个shp文件解析成一个gml文件。解析GML文件(来自shp一个)C

然后我想在我的C函数中解析这个文件。

sprintf(buffer, "PATH=/Library/Frameworks/GDAL.framework/Programs:$PATH:/usr/local/bin ogr2ogr -f \"GML\" files/Extraction/coord.gml %s", lectureFichier); 
system(buffer); 

sprintf(buff, "sed \"2s/.*/\\<ogr:FeatureCollection\\>/\" files/Extraction/coord.gml | sed '3,6d' > files/Extraction/temp.xml"); 
system(buff); 

FILE *fichier = NULL; 
FILE *final = NULL; 
fichier = fopen("files/Extraction/temporaire.csv", "w+"); 

xmlDocPtr doc; 
xmlChar *xpath = (xmlChar*) "//keyword"; 
xmlNodeSetPtr nodeset; 
xmlXPathContextPtr context; 
xmlXPathObjectPtr result; 
int i; 

doc = xmlParseFile("files/Extraction/temp.xml"); 

当我执行该程序,我有一个错误,因为命名空间前缀的每一行(或GML ​​OGR)未限定)temp.xml的

<ogr:FeatureCollection> 
<gml:boundedBy> 
<gml:Box> 
<gml:coord><gml:X>847001.4933830451</gml:X><gml:Y>6298087.567566251</gml:Y></gml:coord> 
<gml:coord><gml:X>859036.8755179688</gml:X><gml:Y>6309720.622619263</gml:Y></gml:coord> 
</gml:Box> 
</gml:boundedBy>       
<gml:featureMember> 

你知道如何让程序知道这些新的命名空间吗?

编辑:

xmlDocPtr doc; 
xmlChar *xpath = (xmlChar*) "//keyword"; 
xmlNodeSetPtr nodeset; 
xmlXPathContextPtr context; 
xmlXPathRegisterNs(context, "ogr", "http://ogr.maptools.org/"); 
    xmlXPathRegisterNs(context, "gml", "http://www.opengis.net/gml"); 
xmlXPathObjectPtr result; 
int i; 
doc = xmlParseFile("files/Extraction/temp.xml"); 
if (doc == NULL) { 
    fprintf(stderr,"Document not parsed successfully. \n"); 
    return 0; 
} 

context = xmlXPathNewContext(doc); 
if (context == NULL) { 
    printf("Error in xmlXPathNewContext\n"); 
    return 0; 
} 

xpath = "//gml:coordinates/text()"; 
result = xmlXPathEvalExpression(xpath, context); 
xmlXPathFreeContext(context); 
if (result == NULL) { 
    printf("Error in xmlXPathEvalExpression\n"); 
    return 0; 
} 

if(xmlXPathNodeSetIsEmpty(result->nodesetval)){ 
    xmlXPathFreeObject(result); 
    printf("No result\n"); 
    return 0; 
} 

`

当添加你给我什么,我有一个赛格故障,我真的不知道它是的,但似乎我”越来越接近答案。

你知道我错了吗?

我倒觉得,你只需要在命名空间声明添加到FeatureCollection元素,所以它看起来像这样:

<ogr:FeatureCollection 
    xmlns:ogr="http://ogr.maptools.org/" 
    xmlns:gml="http://www.opengis.net/gml"> 

可以assumedly做,在你的sed脚本。

当试图用xpath查询命名空间元素时,您需要首先注册命名空间。所以,你可能需要做这样的事情:

xmlXPathRegisterNs(context, "ogr", "http://ogr.maptools.org/") 
xmlXPathRegisterNs(context, "gml", "http://www.opengis.net/gml") 

然后,当你想查询GML或OGR元素,你会做这样这样的:

xpath = "//gml:coordinates/text()"; 
xmlXPathEvalExpression(xpath, context); 
+0

事实上,sed脚本我使用的是删除内容,因为它似乎是,当我尝试解析gml文件时,第一个节点变为空 – user2550416

+0

为什么您在问题中显示的temp.xml示例仍然具有“ '如果sed脚本删除了它? –

+0

Sed脚本删除了的内容。“ 实际上,第一个文件包含: ' user2550416