使用msxmlc++在现有XML文件中添加另一个XML文件



我正在处理这个项目,在这个项目中我使用MSXML解析器来创建和解析XML文档。现有的实现使用CMarkup,它有一个功能,使用addsubdoc(xmlfile)添加另一个XML文档到现有的文档,但当我尝试使用MSXML解析器时,它不会发生。

有人有解决办法吗?

例如我所尝试的:

CString str = L"<?xml version="1.0" encoding="utf-16"?>rn"
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>

现在我想给str添加子元素,让它在Book标签下自动添加。所以我做了:

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"?>rn"
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%sn", static_cast<PCSTR>(pXMLDom1->xml));
printf("Dynamically created DOM:n%sn", static_cast<PCSTR>(pXMLDom2->xml));
// To get root node
CString root = (LPCSTR)pXMLDom1->GetfirstChild()->baseName;
pXMLDom1->selectSingleNode(root)->appendChild(pXMLDom2);
printf("Merged XML:n%sn", static_cast<PCSTR>(pXMLDom1->xml));
}

试试这个:

pXMLDom1->documentElement->appendChild(pXMLDom2->documentElement)

或者稍微修改一下代码:

CString root = (LPCSTR)pXMLDom1->documentElement;
pXMLDom1->selectSingleNode(root)->appendChild(pXMLDom2->documentElement);

同样,请注意pXMLDom1->GetfirstChild()->baseName会得到"xml"