使用 MSXML C++ 将另一个 XML 文件添加到现有 XML 文件

Add another XML file to existing XML file using MSXML C++

提问人:DevPy 提问时间:8/19/2021 最后编辑:DevPy 更新时间:6/9/2022 访问量:393

问:

我正在处理该项目,其中我使用 MSXML 分析器创建和分析 XML 文档。现有实现使用 CMarkup,它具有将另一个 XML 文档添加到现有文档的功能,但是当我尝试使用 MSXML 分析器时,它没有发生。addsubdoc(xmlfile)

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

例如,我尝试过的:

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>

现在我想将 sub 添加到 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\"?>\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 XML 可视化 C++ MSXML MSXML6

评论

0赞 Alan Birtles 8/19/2021
我猜是失败了,因为XML无效pXMLDom2->loadXMLsub
0赞 DevPy 8/19/2021
@AlanBirtles我创建了它作为示例,只是更正了 xml 以给出我想要的想法。如果你能帮忙就好了,我被困住了!:(
0赞 Alan Birtles 8/19/2021
您是否尝试过检查结果?我想应该是?loadXmlpXMLDom2->selectSingleNodepXMLDom1
0赞 DevPy 8/19/2021
是的。。loadXML工作正常,在打印时会给出正确的输出。是的,selectSingleNode 是 pXMLDom1,我更改了它。
0赞 Alan Birtles 8/19/2021
请提供一个最小的可重复示例

答:

0赞 johv 6/9/2022 #1

试试这个:

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

或者,稍微修改一下代码:

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

另外,请注意,这会给你.pXMLDom1->GetfirstChild()->baseName"xml"