首页 > 解决方案 > 使用 MSXML C++ 将另一个 XML 文件添加到现有 XML 文件

问题描述

我正在研究这个项目,我正在使用 MSXML 解析器来创建和解析 XML 文档。现有实现使用 CMarkup 并且它具有将另一个 XML 文档添加到现有文档的功能,addsubdoc(xmlfile)但是当我尝试使用 MSXML 解析器时它没有发生。

有没有人对此有解决方案。

例如我尝试过的:

CString str = L"<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n"
            L"<Book>"
            L"<Text>"
            L"<Name>CPP</Name>"
            L"<Author>Henry</Author>"
            L"</Text>"
            L"</Book>";
CString sub = L"<Text>"
              L"<Name>5656</Name>"
              L"<Author>Steve</Author>"
              L"</Text>"

我想要的xml是:

<Book>
<Text>...</Text>
<Text>..New added..</Text>
</Book>

现在我想以一种在 Book 标签下自动添加的方式将 sub 添加到 str 中。所以我做了:

pXMLDom1->loadXML(_bstr_t(str));
pXMLDom2->loadXML(_bstr_t(sub));
// To get root node
CString root = (LPCSTR)pXMLDom1->GetfirstChild()->baseName;
pXMLDom1->selectSingleNode(root)->appendChild(pXMLDom2);

但它不添加数据。

要测试的示例代码:

#import <msxml6.dll>
#include "msxml2.h"
#include <iostream>
#include <atlstr.h>

void main()
{

MSXML2::IXMLDOMDocumentPtr pXMLDom1;
MSXML2::IXMLDOMDocumentPtr pXMLDom2;
HRESULT hr = pXMLDom.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);
HRESULT hr2 = pXMLDom2.CreateInstance(__uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);

CString str = L"<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n"
              L"<Book>"
              L"<Text>"
              L"<Name>CPP</Name>"
              L"<Author>Henry</Author>"
              L"</Text>"
              L"</Book>";

CString sub = L"<Text>"
              L"<Name>5656</Name>"
              L"<Author>Steve</Author>"
              L"</Text>";

pXMLDom1->loadXML(_bstr_t(str));
pXMLDom2->loadXML(_bstr_t(sub));

printf("Dynamically created DOM:\n%s\n", static_cast<PCSTR>(pXMLDom1->xml));
printf("Dynamically created DOM:\n%s\n", static_cast<PCSTR>(pXMLDom2->xml));

// To get root node
CString root = (LPCSTR)pXMLDom1->GetfirstChild()->baseName;
pXMLDom1->selectSingleNode(root)->appendChild(pXMLDom2);

printf("Merged XML:\n%s\n", static_cast<PCSTR>(pXMLDom1->xml));
}

标签: c++xmlvisual-c++msxmlmsxml6

解决方案


推荐阅读