개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.07.09 04:30

DOMNode::appendChild 문제점에 대한 도움을 부탁드립니다.

목록
  • CI/CD장인 12일 전 2025.07.09 04:30
  • 77
    1
DOMNode::appendChild를 사용하여 노드를 추가할 때, 기존 노드의 자식 노드가 삭제되는 이유를 알고 싶습니다.

아래 예제에서, 노드 A에 노드 B를 추가하면 노드 A의 자식 노드인 노드 C는 삭제되는 것을 확인했습니다.

```cpp
#include
#include
#include

int main() {
xmlDocPtr doc = xmlParseFile("example.xml");
xmlNodePtr root = xmlDocGetRootElement(doc);
xmlNodePtr nodeA = xmlNewNode(NULL, BAD_CAST "A");
xmlNodePtr nodeB = xmlNewNode(NULL, BAD_CAST "B");
xmlNodePtr nodeC = xmlNewNode(NULL, BAD_CAST "C");

xmlDocSetRootElement(doc, nodeA);
xmlAddChild(nodeA, nodeB);
xmlAddChild(nodeA, nodeC);

xmlNodePtr nodeD = xmlNewNode(NULL, BAD_CAST "D");
xmlAddChild(nodeA, nodeD);

xmlNodePtr child = xmlFirstElementChild(nodeA);
while (child != NULL) {
xmlNodePtr next = xmlNextElementSibling(child);
xmlUnlinkNode(child);
xmlFreeNode(child);
child = next;
}

xmlNodePtr newChild = xmlNewNode(NULL, BAD_CAST "E");
xmlAddChild(nodeA, newChild);

xmlNodePtr newChild2 = xmlNewNode(NULL, BAD_CAST "F");
xmlAddChild(nodeA, newChild2);

xmlNodePtr lastChild = xmlLastElementChild(nodeA);
xmlNodePtr prev = xmlPrevElementSibling(lastChild);
xmlAddChild(nodeA, prev);

xmlNodePtr newChild3 = xmlNewNode(NULL, BAD_CAST "G");
xmlAddChild(nodeA, newChild3);

xmlNodePtr newChild4 = xmlNewNode(NULL, BAD_CAST "H");
xmlAddChild(nodeA, newChild4);

xmlNodePtr firstChild = xmlFirstElementChild(nodeA);
xmlAddChild(nodeA, firstChild);

xmlNodePtr newChild5 = xmlNewNode(NULL, BAD_CAST "I");
xmlAddChild(nodeA, newChild5);

xmlNodePtr newChild6 =

    댓글목록

    profile_image
    나우호스팅  12일 전



    DOMNode::appendChild를 사용하여 노드를 추가할 때, 기존 노드의 자식 노드가 삭제되는 이유는 xmlAddChild 함수가 현재 노드의 자식 노드가 있는 경우, 기존 자식 노드를 삭제하고 새로운 노드를 추가하는 방식으로 작동하기 때문입니다.

    이러한 문제를 해결하기 위해서는 xmlAddChild 함수 대신 xmlNewChild 함수를 사용하여 새로운 노드를 추가하는 방식으로 노드를 추가할 수 있습니다.

    xmlNewChild 함수는 기존 노드의 자식 노드를 삭제하지 않고 새로운 노드를 추가합니다.

    예를 들어, 다음과 같이 노드 A에 노드 B를 추가할 수 있습니다.

    #hostingforum.kr
    cpp
    
    xmlNodePtr nodeB = xmlNewNode(NULL, BAD_CAST "B");
    
    xmlAddChild(nodeA, nodeB);
    
    


    또는 xmlNewChild 함수를 사용하여 다음과 같이 노드 A에 노드 B를 추가할 수 있습니다.

    #hostingforum.kr
    cpp
    
    xmlNodePtr nodeB = xmlNewNode(NULL, BAD_CAST "B");
    
    nodeB->parent = nodeA;
    
    nodeB->next = nodeA->children;
    
    nodeA->children = nodeB;
    
    


    이러한 방식으로 노드를 추가하면 기존 노드의 자식 노드가 삭제되지 않습니다.

    2025-07-09 04:31

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 37,755건 / 49 페이지

검색

게시물 검색