使用 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); 谢谢。

xmlNodeSetContentxmlNodePtr 作为第一个参数:

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 为 Untitledgon),带有 <b> 它们之间的元素节点,它本身有一个文本节点子节点(内容为Poly)。

cur->xmlChildrenNode 上使用 xmlNodeSetContent,您应该会看到结果。