在C中解析GML文件(来自shp文件)

时间:2013-07-10 09:59:48

标签: c xml shapefile gml-geographic-markup-lan

我的问题是,使用ogr2​​ogr,我将一个shp文件解析为一个gml文件。

然后我想在我的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;
}

`

在添加你给我的内容时,我遇到了Seg Fault,我真的不知道它来自哪里,但似乎我越来越接近答案了。

你知道我哪里错了吗?

1 个答案:

答案 0 :(得分:0)

我认为你只需要将命名空间声明添加到FeatureCollection元素,所以看起来像这样:

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

你可以假设在你的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);