
	                	                 
XMLDiffMemory::merge 함수는 두 개의 XML 문서를 병합할 때, mergeTargetNode의 자식 노드가 mergeSourceNode의 자식 노드보다 많은 경우, mergeTargetNode의 자식 노드의 순서가 바뀌지 않도록 처리할 수 있습니다.
mergeTargetNode의 자식 노드 중 중복되는 노드가 있을 때, mergeSourceNode의 자식 노드 중 중복되는 노드도 같이 병합되도록 하려면, 다음과 같이 처리할 수 있습니다.
1.  mergeTargetNode의 자식 노드 중 중복되는 노드를 식별합니다.
2.  mergeSourceNode의 자식 노드 중 중복되는 노드를 식별합니다.
3.  중복되는 노드가 있는 경우, mergeTargetNode의 자식 노드의 순서를 유지하면서, mergeSourceNode의 자식 노드를 병합합니다.
예제 코드는 다음과 같습니다.
#hostingforum.kr
cpp
#include 
#include 
#include 
#include 
// XML 노드 구조
struct Node {
    std::string name;
    std::vector children;
};
// XMLDiffMemory::merge 함수를 사용하여 두 개의 XML 문서를 병합합니다.
Node merge(const Node& target, const Node& source) {
    // mergeTargetNode의 자식 노드 중 중복되는 노드를 식별합니다.
    std::map targetChildren;
    for (const auto& child : target.children) {
        targetChildren[child.name] = child;
    }
    // mergeSourceNode의 자식 노드 중 중복되는 노드를 식별합니다.
    std::map sourceChildren;
    for (const auto& child : source.children) {
        sourceChildren[child.name] = child;
    }
    // 중복되는 노드가 있는 경우, mergeTargetNode의 자식 노드의 순서를 유지하면서, mergeSourceNode의 자식 노드를 병합합니다.
    for (const auto& child : source.children) {
        if (targetChildren.find(child.name) != targetChildren.end()) {
            // 중복되는 노드가 있는 경우, mergeTargetNode의 자식 노드의 순서를 유지하면서, mergeSourceNode의 자식 노드를 병합합니다.
            target.children.push_back(child);
        } else {
            // 중복되지 않는 노드의 경우, mergeTargetNode의 자식 노드에 추가합니다.
            target.children.push_back(child);
        }
    }
    return target;
}
int main() {
    // 예제 XML 문서
    Node target = {
        "root",
        {
            {"child1", {}},
            {"child2", {}},
            {"child3", {}}
        }
    };
    Node source = {
        "root",
        {
            {"child2", {}},
            {"child4", {}},
            {"child5", {}}
        }
    };
    // 두 개의 XML 문서를 병합합니다.
    Node merged = merge(target, source);
    // 병합된 XML 문서를 출력합니다.
    std::cout << "병합된 XML 문서:" << std::endl;
    std::cout << "<" << merged.name << ">" << std::endl;
    for (const auto& child : merged.children) {
        std::cout << "  <" << child.name << ">" << std::endl;
        for (const auto& grandchild : child.children) {
            std::cout << "    <" << grandchild.name << ">" << std::endl;
        }
        std::cout << "  " << child.name << ">" << std::endl;
    }
    std::cout << "" << merged.name << ">" << std::endl;
    return 0;
}
이 예제 코드는 두 개의 XML 문서를 병합할 때, mergeTargetNode의 자식 노드 중 중복되는 노드가 있을 때, mergeSourceNode의 자식 노드 중 중복되는 노드도 같이 병합되도록 처리합니다. 또한, mergeTargetNode의 자식 노드의 순서가 바뀌지 않도록 처리합니다.
2025-06-23 17:51