解析GML文件(来自shp一个)C
问题描述:
我的问题是,使用ogr2ogr,我将一个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);
事实上,sed脚本我使用的是删除内容,因为它似乎是,当我尝试解析gml文件时,第一个节点变为空 –
user2550416
为什么您在问题中显示的temp.xml示例仍然具有“'如果sed脚本删除了它? –
Sed脚本删除了的内容。“ 实际上,第一个文件包含: '
user2550416