2013-07-10 4 views
1

Моя проблема заключается в том, что, используя ogr2ogr, я разбираю файл shp в gml.Проанализируйте файл GML (из shp one) в 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> 

У вас есть идея, как заставить программу знать это новое пространство имен?

EDIT:

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; 
} 

`

При добавлении, что вы дали мне, я с сегм Fault, и я действительно не знаю, откуда это, но мне кажется, я» м ближе к ответу.

У вас есть идея, когда я не в порядке?

ответ

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); 
+0

На самом деле, СЭД сценарий Я использую это для удаления содержимого , потому что кажется, что, когда я пытаюсь разобрать файл gml, первый узел становится пустым – user2550416

+0

Почему в примере temp.xml, который вы показали в своем вопросе, ', если sed-скрипт удалил его? –

+0

Сценарий Sed делелирует содержимое '' Фактически первый файл содержит: '' Но, похоже, все равно, несмотря на ошибки, я ждал завершения выполнения, и созданный файл хороший, но лучше будет без ошибки. Если кто-то знает? Спасибо в любом случае James Holderness :) – user2550416

 Смежные вопросы

  • Нет связанных вопросов^_^