Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libmxl2-元素的更改值,包含混合内容_C_Libxml2 - Fatal编程技术网

C libmxl2-元素的更改值,包含混合内容

C libmxl2-元素的更改值,包含混合内容,c,libxml2,C,Libxml2,我正在为使用libxml2库做一些小包装。如果元素的内容是混合的,那么更改元素值也会有问题 在下面的示例中,我创建了具有“oldcontent”值和子级“child1.1”的“child1”元素。然后,我尝试使用xmlNodeSetContent函数将“child1”值更改为“newcontent”(用next标记的行) { if(it->type==XML\u TEXT\u节点) { xmlNodeSetContent(它,不正确的值); bFound=1; } } 如果(!bFound) {

我正在为使用libxml2库做一些小包装。如果元素的内容是混合的,那么更改元素值也会有问题

在下面的示例中,我创建了具有“oldcontent”值和子级“child1.1”的“child1”元素。然后,我尝试使用
xmlNodeSetContent
函数将“child1”值更改为“newcontent”(用next标记的行) { if(it->type==XML\u TEXT\u节点) { xmlNodeSetContent(它,不正确的值); bFound=1; } } 如果(!bFound) { xmlNodeSetContent(元素,无效值); } } void setElementAttribute(xmlNodePtr元素,char*attribName,char*attribValue) { xmlSetProp(元素,错误的属性名,错误的属性值); } void printXml(xmlDocPtr doc) { xmlChar*xmlbuff; int缓冲区大小; //xmlDocDumpFormatMemory(doc、&xmlbuff、&buffersize,1); xmlDocDumpFormatMemoryEnc(doc,&xmlbuff,&buffersize,MY_编码,1); printf(“%s”,(char*)xmlbuff); xmlcleanuparser(); xmlFree(xmlbuff); } int main(int argc,字符**argv) { xmlDocPtr doc=NULL; xmlNodePtr root=NULL; xmlNodePtr tmp1=NULL; xmlNodePtr tmp11=NULL; xmlNodePtr tmp2=NULL; xmlNodePtr tmp3=NULL; xmlNodePtr it=NULL; doc=xmlNewDoc(BAD_CAST“1.0”); root=createRoot(doc,“root”); //tmp1=addChild(根,“child1”,NULL); tmp1=addChild(根,“child1”,“旧内容”); tmp11=addChild(tmp1,“child1.1”,NULL); setElementContent(tmp11,“blabla”); tmp2=addChild(根,“child2”,NULL); setElementContent(tmp2,“22222”); setElementAttribute(tmp2,“id”,“002”); setElementAttribute(tmp2,“lang”,“en”); tmp3=addChild(根,“child3”,NULL);/*创建空*/ printf(“\n前:\n”); printXml(doc); setElementContent(tmp1,“新内容”); 设置元素内容(tmp3,“333”); printf(“\n之后:\n”); printXml(doc); xmlFreeDoc(doc); 返回0; }
混合内容由一系列文本节点和元素节点表示。您必须检索文本节点并仅替换其内容:

xmlNodePtr textNode = &tmp1->children[0];
setElementContent(textNode, "NEW CONTENT");
//setElementContent(tmp1, "NEW CONTENT");   // <---
xmlNodePtr textNode=&tmp1->children[0];
setElementContent(textNode,“新内容”);

//setElementContent(tmp1,“新内容”);//谢谢!这似乎是正确的方法。我对新代码提出了质疑。用于设置内容的函数现在搜索文本元素,如果找到,它将更改值。如果找不到,则放入新元素。
#include <stdio.h>
#include <string.h>

#include <libxml/parser.h>
#include <libxml/tree.h>

#define MY_ENCODING "ISO-8859-1"

xmlNodePtr createRoot(xmlDocPtr doc, char* name)
{
    xmlNodePtr root;
    root = xmlNewNode(NULL, BAD_CAST name);
    xmlDocSetRootElement(doc, root);
    return root;
}

xmlNodePtr addChild(xmlNodePtr parent, char* name, char* value)
{
    return xmlNewChild(parent, NULL, BAD_CAST name, BAD_CAST value);
}

void setElementContent(xmlNodePtr element, char* value)
{
    xmlNodePtr it = NULL;
    int bFound = 0;

    for (it = element->children; it != NULL; it = it->next)
    {
        if (it->type == XML_TEXT_NODE)
        {
            xmlNodeSetContent(it, BAD_CAST value);
            bFound = 1;
        }
    }

    if (!bFound)
    {
        xmlNodeSetContent(element, BAD_CAST value);
    }
}

void setElementAttribute(xmlNodePtr element, char* attribName, char* attribValue)
{
    xmlSetProp(element, BAD_CAST attribName, BAD_CAST attribValue);
}

void printXml(xmlDocPtr doc)
{
    xmlChar* xmlbuff;
    int buffersize;

    //xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
    xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, MY_ENCODING, 1);
    printf("%s", (char *) xmlbuff);
    xmlCleanupParser();
    xmlFree(xmlbuff);
}

int main(int argc, char** argv)
{
    xmlDocPtr doc = NULL;
    xmlNodePtr root = NULL;
    xmlNodePtr tmp1 = NULL;
    xmlNodePtr tmp11 = NULL;
    xmlNodePtr tmp2 = NULL;
    xmlNodePtr tmp3 = NULL;
    xmlNodePtr it = NULL;

    doc = xmlNewDoc(BAD_CAST "1.0");

    root = createRoot(doc, "root");

    //tmp1 = addChild(root, "child1", NULL);
    tmp1 = addChild(root, "child1", "OLD CONTENT");

    tmp11 = addChild(tmp1, "child1.1", NULL);
    setElementContent(tmp11, "blablabla");

    tmp2 = addChild(root, "child2", NULL);
    setElementContent(tmp2, "22222");
    setElementAttribute(tmp2, "id", "002");
    setElementAttribute(tmp2, "lang", "en");

    tmp3 = addChild(root, "child3", NULL); /* create empty */

    printf("\nBefore:\n");
    printXml(doc);

    setElementContent(tmp1, "NEW CONTENT");
    setElementContent(tmp3, "333");

    printf("\nAfter:\n");
    printXml(doc);

    xmlFreeDoc(doc);

    return 0;
}
xmlNodePtr textNode = &tmp1->children[0];
setElementContent(textNode, "NEW CONTENT");
//setElementContent(tmp1, "NEW CONTENT");   // <---