libxml2 라이브러리를 사용하기 위해 약간의 래퍼를 만들고 있습니다. 그리고 혼합 된 내용이있는 경우 요소 값을 변경하는 데 문제가 있습니다.libmxl2 - 혼합 된 내용으로 요소의 값을 변경하십시오.
다음 예제에서는 "OLD CONTENT"값과 하위 자식 "child1.1"이있는 "child1"요소를 만듭니다. 그런 다음 xmlNodeSetContent
함수 (< ---로 표시된 줄)를 사용하여 "child1"값을 "NEW CONTENT"로 변경하려고합니다. 문제는 "child1.1"이 xmlNodeSetContent
에 의해 제거된다는 것입니다. "오래된 콘텐츠"에서 "새로운 콘텐츠"로만 값을 변경하고 싶습니다.
아마도 xmlNodeSetContent
은이 작업을 수행하는 적절한 기능이 아니거나 libxml2에 뭔가있는 것 같습니다. 누락되었습니다.
질문 :에는 혼합 된 콘텐츠의 경우 값을 변경하는 방법이 있습니까? 그렇다면 어떻게해야합니까?
#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)
{
xmlNodeSetContent(element, BAD_CAST value);
}
void setElementAttribute(xmlNodePtr element, char* attribName, char* attribValue)
{
xmlSetProp(element, BAD_CAST attribName, BAD_CAST attribValue);
}
int main(int argc, char** argv)
{
xmlDocPtr doc = NULL;
xmlNodePtr root = NULL;
xmlNodePtr tmp1 = NULL;
xmlNodePtr tmp11 = NULL;
xmlNodePtr tmp2 = NULL;
xmlChar* xmlbuff;
int buffersize;
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");
setElementContent(tmp1, "NEW CONTENT"); // <---
//xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, MY_ENCODING, 1);
printf("%s", (char *) xmlbuff);
xmlCleanupParser();
xmlFree(xmlbuff);
xmlFreeDoc(doc);
return 0;
}
EDIT : 작업 버전 :
#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;
}
고마워요! 이것은 적절한 방법 인 것 같습니다. 나는 새로운 코드를 질문에 넣었다. 내용을 설정하는 기능은 이제 텍스트 요소를 검색하고 발견되면 값을 변경합니다. 발견되지 않으면 새로운 요소를 넣습니다. –