使用 C 中的 libxml2 库更新 kml 文件的内容
Updating the contents of a kml file, using libxml2 library in C
我正在尝试使用 C 使用 libxml2 头文件提取特定数据集。除了节点内容的更改外,其他所有部分都在工作。这是非常重要的,因为我不希望程序读取同一组数据点。程序运行没有错误,但内容不会改变。
这是代码的一部分:
int parseName (xmlDocPtr doc,xmlNodePtr cur) {
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"Placemark"))) {
cur = cur ->xmlChildrenNode;
while(cur != NULL){
if((!xmlStrcmp(cur->name, (const xmlChar *)"name"))) {
key = xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
if((!xmlStrcmp(key,(const xmlChar *)"Untitled Polygon"))){
xmlNodeSetContent(cur->content,(const xmlChar *)"Done");
return 1;
}
else if((!xmlStrcmp(key,(const xmlChar *)"Out")))
return -1;
}
cur=cur->next;
}
}
cur=cur->next;
}
return 0;
}
此处 xmlNodeSetContent 不起作用。但是函数还是returns 1.
编辑:kml 文件是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<Placemark>
<name>Untitled Polygon</name>
<styleUrl>#m_ylw-pushpin</styleUrl>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
77.58482071603055,12.86858949944241,0 77.60057575684357,12.86642619038822,0 77.60374633781389,12.88004602175216,0 77.5844101227442,12.88296731261186,0 77.58482071603055,12.86858949944241,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
我可以成功提取坐标但无法将名称更改为其他名称。它只是坚持 "Untitled Polygon".
更新答案:更改了一行,xmlNodeSetContent(cur->xmlChildrenNode,(const xmlChar *)"Done");
将再添加一行以保存对文件内容所做的更改:xmlSaveFormatFile ("NOW1.kml", doc, 0);
谢谢。
xmlNodeSetContent
将 xmlNodePtr
作为第一个参数:
void xmlNodeSetContent (xmlNodePtr cur,
const xmlChar * content)
所以换行
xmlNodeSetContent(cur->content,(const xmlChar *)"Done");
到
xmlNodeSetContent(cur, (const xmlChar *)"Done");
如果您启用了编译器警告,编译器会指出您这个问题。
cur的content成员没有被使用,这就是为什么你设置的时候看不到效果的原因。像 cur 这样的元素节点从不使用它们的 "content" 成员,而是它们具有具有内容的 "text" 类型的子节点。
请注意,在查找 "Untitled Polygon"
时,您是在 cur->xmlChildrenNode
上使用 xmlNodeListGetString
,而不是 cur
本身。那个 xmlChildrenNode 是文本节点。
它是这样设计的,所以如果你遇到像 <name>Untitled <b>Poly</b>gon</name>
这样的情况,你会看到 2 个子文本节点(contnet 为 Untitled
和 gon
),带有 <b>
它们之间的元素节点,它本身有一个文本节点子节点(内容为Poly
)。
在 cur->xmlChildrenNode
上使用 xmlNodeSetContent
,您应该会看到结果。
我正在尝试使用 C 使用 libxml2 头文件提取特定数据集。除了节点内容的更改外,其他所有部分都在工作。这是非常重要的,因为我不希望程序读取同一组数据点。程序运行没有错误,但内容不会改变。
这是代码的一部分:
int parseName (xmlDocPtr doc,xmlNodePtr cur) {
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"Placemark"))) {
cur = cur ->xmlChildrenNode;
while(cur != NULL){
if((!xmlStrcmp(cur->name, (const xmlChar *)"name"))) {
key = xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
if((!xmlStrcmp(key,(const xmlChar *)"Untitled Polygon"))){
xmlNodeSetContent(cur->content,(const xmlChar *)"Done");
return 1;
}
else if((!xmlStrcmp(key,(const xmlChar *)"Out")))
return -1;
}
cur=cur->next;
}
}
cur=cur->next;
}
return 0;
}
此处 xmlNodeSetContent 不起作用。但是函数还是returns 1.
编辑:kml 文件是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<Placemark>
<name>Untitled Polygon</name>
<styleUrl>#m_ylw-pushpin</styleUrl>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
77.58482071603055,12.86858949944241,0 77.60057575684357,12.86642619038822,0 77.60374633781389,12.88004602175216,0 77.5844101227442,12.88296731261186,0 77.58482071603055,12.86858949944241,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
我可以成功提取坐标但无法将名称更改为其他名称。它只是坚持 "Untitled Polygon".
更新答案:更改了一行,xmlNodeSetContent(cur->xmlChildrenNode,(const xmlChar *)"Done");
将再添加一行以保存对文件内容所做的更改:xmlSaveFormatFile ("NOW1.kml", doc, 0);
谢谢。
xmlNodeSetContent
将 xmlNodePtr
作为第一个参数:
void xmlNodeSetContent (xmlNodePtr cur,
const xmlChar * content)
所以换行
xmlNodeSetContent(cur->content,(const xmlChar *)"Done");
到
xmlNodeSetContent(cur, (const xmlChar *)"Done");
如果您启用了编译器警告,编译器会指出您这个问题。
cur的content成员没有被使用,这就是为什么你设置的时候看不到效果的原因。像 cur 这样的元素节点从不使用它们的 "content" 成员,而是它们具有具有内容的 "text" 类型的子节点。
请注意,在查找 "Untitled Polygon"
时,您是在 cur->xmlChildrenNode
上使用 xmlNodeListGetString
,而不是 cur
本身。那个 xmlChildrenNode 是文本节点。
它是这样设计的,所以如果你遇到像 <name>Untitled <b>Poly</b>gon</name>
这样的情况,你会看到 2 个子文本节点(contnet 为 Untitled
和 gon
),带有 <b>
它们之间的元素节点,它本身有一个文本节点子节点(内容为Poly
)。
在 cur->xmlChildrenNode
上使用 xmlNodeSetContent
,您应该会看到结果。