VS2008 VC++ XML操作
1. msxmlchs.msi的安装
安装msxml 4.0 sp2时要注意不要用默认安装,要选择自定义安装(全部安装)才能选择安装SDK,若没有选择安装SDk会发现安装完成后安装目录下什么也没有,而选择了SDK的安装可以在目录下看到LIB INC doc 3个文件夹
2. 注册dll
命令行输入如下命令可以弹出注册成功的对话框
cd c:\windows\system32
regsvr32 msxml4.dll (也可在运行框中直接输入这句)
3. VS2008 设置
工具->选项->项目和解决方案->VC++目录
Include添加INC的的路径C:\Program Files\MSXML 4.0\INC
Library添加INC的的路径C:\Program Files\MSXML 4.0\LIB
4. VC60 设置
Tools->Options... ->Directories tab->Include添加INC的的路径C:\Program Files\MSXML 4.0\INC
Tools->Options... ->Directories tab->Library添加INC的的路径C:\Program Files\MSXML 4.0\LIB
5. 新建项目,链接库
代码中#include <msxml2.h>
VC60 open Project Settings by clicking Settings from the Project menu. Select the Link tab. Append "msxml2.lib" to the Object/library modules: textbox.
6. Code1:
//部分变量无法识别时在前面加命名空间MSXML2::
#include <stdio.h>
#import <msxml4.dll>
using namespace MSXML2;
int main(int argc, char* argv[])
{
MSXML2::IXMLDOMDocument2Ptr pXMLDom;
HRESULT hr;
CoInitialize(NULL);
hr = pXMLDom.CreateInstance(__uuidof(DOMDocument40));
if (FAILED(hr))
{
printf("Failed to CreateInstance on an XML DOM");
return NULL;
}
pXMLDom->preserveWhiteSpace = VARIANT_TRUE;
// Create a processing instruction targeted for xml.
MSXML2::IXMLDOMProcessingInstructionPtr pi;
pi = pXMLDom->createProcessingInstruction("xml", "version='1.0'");
if (pi != NULL) {
pXMLDom->appendChild(pi);
pi.Release();
}
// Create a processing instruction targeted for xml-stylesheet.
pi = pXMLDom->createProcessingInstruction("xml-stylesheet",
"type='text/xml' href='dom.xsl'");
if (pi != NULL) {
pXMLDom->appendChild(pi);
pi.Release();
}
// Create a comment for the document.
MSXML2::IXMLDOMCommentPtr pc;
pc = pXMLDom->createComment("sample xml file created using XML DOM object.");
if (pc != NULL) {
pXMLDom->appendChild(pc);
pc.Release();
}
// Create the root element (i.e., the documentElement).
MSXML2::IXMLDOMElementPtr pe;
pe = pXMLDom->createElement("root");
// Create a "created" attribute for the root element and
// assign the "using dom" character data as the attribute value.
MSXML2::IXMLDOMAttributePtr pa;
pa = pXMLDom->createAttribute("created");
if (pa != NULL)
{
pa->value = "using dom";
pe->setAttributeNode(pa);
pa.Release();
}
// Add the root element to the DOM instance.
pXMLDom->appendChild(pe);
pe.Release();
// Next, we will create and add more nodes to the root element
// we've just created.
// Create an element to hold text content.
pe = pXMLDom->createElement("node1");
if (pe != NULL)
{
// Add newline + tab for indentation.
pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n\t"));
pe->text = "some character data";
pXMLDom->documentElement->appendChild(pe);
pe.Release();
}
// Create an element to hold a CDATA section.
pe=pXMLDom->createElement("node2");
if (pe != NULL)
{
// Add newline + tab for indentation.
pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n\t"));
MSXML2::IXMLDOMCDATASectionPtr pcd;
pcd = pXMLDom->createCDATASection("<some mark-up text>");
if (pcd != NULL) {
pe->appendChild(pcd);
pcd.Release();
}
pXMLDom->documentElement->appendChild(pe);
pe.Release();
}
// Create an element to hold three empty subelements.
pe=pXMLDom->createElement("node3");
if (pe != NULL)
{
// Add newline +tab for indentation.
pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n\t"));
MSXML2::IXMLDOMDocumentFragmentPtr pdf;
pdf = pXMLDom->createDocumentFragment();
pdf->appendChild(pXMLDom->createTextNode("\n\t\t"));
pdf->appendChild(pXMLDom->createElement("subNode1"));
pdf->appendChild(pXMLDom->createTextNode("\n\t\t"));
pdf->appendChild(pXMLDom->createElement("subNode2"));
pdf->appendChild(pXMLDom->createTextNode("\n\t\t"));
pdf->appendChild(pXMLDom->createElement("subNode3"));
pdf->appendChild(pXMLDom->createTextNode("\n\t"));
pe->appendChild(pdf);
pdf.Release();
pXMLDom->documentElement->appendChild(pe);
pe.Release();
pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n"));
}
printf("Dynamically created DOM:\n%s\n",
(LPCSTR)pXMLDom->xml);
hr = pXMLDom->save("dynaDom.xml");
if (FAILED(hr))
{
printf("Failed to save DOM to dynaDom.xml\n");
}
else
{
printf("DOM saved to dynamDom.xml\n");
}
if (pXMLDom) pXMLDom.Release();
CoUninitialize();
return 0;
}
结果:
Dynamically created DOM:
<?xml version="1.0"?>
<?xml-stylesheet type='text/xml' href='dom.xsl'?>
<!--sample xml file created using XML DOM object.-->
<root created="using dom">
<node1>some character data</node1>
<node2><![CDATA[<some mark-up text>]]></node2>
<node3>
<subNode1/>
<subNode2/>
<subNode3/>
</node3>
</root>
DOM saved to dynamDom.xml
7. Code2(未编译验证):
#include <stdio.h>
#include <msxml2.h>
// You might need to add the msxml4/sdk/(inc, lib) directories
// to the Tools->Options...->Directories in Visual Studio.
//
// You might also need to append "msxml2.lib" to the
// Project->Settings...->Link->Object/Libray Modules field.
int main(int argc, char* argv[])
{
HRESULT hr;
IXMLDOMDocument3 *pXMLDoc = NULL;
IXMLDOMParseError * pObjError = NULL;
BSTR bstr = NULL;
VARIANT_BOOL status;
VARIANT vSrc;
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_DOMDocument40,
NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument3,
(void**)&pXMLDoc);
if (FAILED(hr))
{
printf("Failed to CoCreate an instance of an XML DOM\n");
printf("Error code: %x\n", hr);
goto clean;
}
hr = pXMLDoc->put_async(VARIANT_FALSE);
if (FAILED(hr))
{
printf("Failed to set async property\n");
goto clean;
}
hr = pXMLDoc->put_validateOnParse(VARIANT_FALSE);
if (FAILED(hr))
{
printf("Failed to set validateOnParse\n");
goto clean;
}
hr = pXMLDoc->put_resolveExternals(VARIANT_FALSE);
if (FAILED(hr))
{
printf("Failed to disable resolving externals.\n");
goto clean;
}
VariantInit(&vSrc);
V_BSTR(&vSrc) = SysAllocString(L"stocks.xml");
V_VT(&vSrc) = VT_BSTR;
hr = pXMLDoc->load(vSrc, &status);
if(status!=VARIANT_TRUE)
{
hr = pXMLDoc->get_parseError(&pObjError);
hr = pObjError->get_reason(&bstr);
printf("Failed to load DOM from books.xml. %S\n",bstr);
goto clean;
}
hr = pXMLDoc->get_xml(&bstr);
printf("stocks.xml:\n%S\n", bstr);
clean:
if (bstr)
SysFreeString(bstr);
if (&vSrc)
VariantClear(&vSrc);
if (pObjError)
pObjError->Release();
if (pXMLDoc)
pXMLDoc->Release();
CoUninitialize();
return 0;
}