小弟初学XML,请大家指教一下.怎么利用VC新建一个XML文档呢?
XML的文档结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<FriendsList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FriendsList.xsd">
<FirendInformation>
<UserID>1001</UserID>
<NickName>fdafas</NickName>
</FirendInformation>
</FriendsList>
XML的文档结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<FriendsList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FriendsList.xsd">
<FirendInformation>
<UserID>1001</UserID>
<NickName>fdafas</NickName>
</FirendInformation>
</FriendsList>
#include <windows.h>
#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;// Macro that calls a COM method returning HRESULT value:
#define HRCALL(a, errmsg) \
do { \
hr = (a); \
if (FAILED(hr)) { \
dprintf( "%s:%d HRCALL Failed: %s\n 0x%.8x = %s\n", \
__FILE__, __LINE__, errmsg, hr, #a ); \
goto clean; \
} \
} while (0)// Helper function that put output in stdout and debug window
// in Visual Studio:
void dprintf( char * format, ...)
{
static char buf[1024];
va_list args;
va_start( args, format );
vsprintf( buf, format, args );
va_end( args);
OutputDebugStringA( buf);
printf("%s", buf);
}// Helper function to create a DOM instance.
IXMLDOMDocument * DomFromCOM()
{
HRESULT hr;
IXMLDOMDocument *pxmldoc = NULL; HRCALL( CoCreateInstance(__uuidof(DOMDocument40),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IXMLDOMDocument),
(void**)&pxmldoc),
"Create a new DOMDocument"); HRCALL( pxmldoc->put_async(VARIANT_FALSE),
"should never fail");
HRCALL( pxmldoc->put_validateOnParse(VARIANT_FALSE),
"should never fail");
HRCALL( pxmldoc->put_resolveExternals(VARIANT_FALSE),
"should never fail");
HRCALL( pxmldoc->put_preserveWhiteSpace(VARIANT_TRUE),
"should never fail"); return pxmldoc;
clean:
if (pxmldoc)
{
pxmldoc->Release();
}
return NULL;
}VARIANT VariantString(BSTR str)
{
VARIANT var;
VariantInit(&var);
V_BSTR(&var) = SysAllocString(str);
V_VT(&var) = VT_BSTR;
return var;
}// Helper function to display xml parse error:
void ReportParseError(IXMLDOMDocument *pDom, char *desc) {
IXMLDOMParseError *pXMLErr=NULL;
BSTR bstrReason = NULL;
HRESULT hr;
HRCALL(pDom->get_parseError(&pXMLErr),
"dom->get_parseError: ");
HRCALL(pXMLErr->get_reason(&bstrReason),
"parseError->get_reason: ");
dprintf("%s %S\n",desc, bstrReason);
clean:
if (pXMLErr) pXMLErr->Release();
if (bstrReason) SysFreeString(bstrReason);
}// Helper function to append a whitespace text node to a
// specified element:
void AddWhiteSpaceToNode(IXMLDOMDocument* pDom,
BSTR bstrWs,
IXMLDOMNode *pNode)
{
HRESULT hr;
IXMLDOMText *pws=NULL;
IXMLDOMNode *pBuf=NULL;
HRCALL(pDom->createTextNode(bstrWs,&pws), " ");
HRCALL(pNode->appendChild(pws,&pBuf)," ");
clean:
if (pws) pws->Release();
pws=NULL;
if (pBuf) pBuf->Release();
pBuf=NULL;
}// Helper function to append a child to a parent node:
void AppendChildToParent(IXMLDOMNode *pChild, IXMLDOMNode *pParent)
{
HRESULT hr;
IXMLDOMNode *pNode=NULL;
HRCALL(pParent->appendChild(pChild, &pNode), "");
clean:
if (pNode) pNode->Release();
pNode=NULL;
}
{
IXMLDOMDocument *pXMLDom=NULL;
IXMLDOMProcessingInstruction *pi=NULL;
IXMLDOMComment *pc=NULL;
IXMLDOMElement *pe=NULL;
IXMLDOMElement *pRoot=NULL;
IXMLDOMAttribute *pa=NULL;
IXMLDOMAttribute *pa1=NULL;
IXMLDOMCDATASection *pcd=NULL;
IXMLDOMElement *peSub=NULL;
IXMLDOMDocumentFragment *pdf=NULL;
BSTR bstr = NULL;
BSTR bstr1 = NULL;
BSTR bstr_wsn = SysAllocString(L"\n");
BSTR bstr_wsnt= SysAllocString(L"\n\t");
BSTR bstr_wsntt=SysAllocString(L"\n\t\t"); VARIANT var;
HRESULT hr; CoInitialize(NULL);
VariantInit(&var);
pXMLDom = DomFromCOM();
if (!pXMLDom) goto clean; // Create a processing instruction element.
bstr = SysAllocString(L"xml");
bstr1 = SysAllocString(L"version='1.0'");
HRCALL(pXMLDom->createProcessingInstruction(
bstr,bstr1, &pi),
"createProcessingInstruction:");
AppendChildToParent(pi, pXMLDom);
pi->Release();
pi=NULL;
SysFreeString(bstr);
bstr=NULL;
SysFreeString(bstr1);
bstr1=NULL; // Create a comment element.
bstr = SysAllocString(L"sample xml file created using XML DOM object.");
HRCALL(pXMLDom->createComment(bstr, &pc), "");
AppendChildToParent(pc, pXMLDom);
SysFreeString(bstr);
bstr=NULL;
pc->Release();
pc=NULL; // Create the root element.
bstr = SysAllocString(L"root");
HRCALL(pXMLDom->createElement(bstr, &pRoot), "");
SysFreeString(bstr);
bstr = NULL; // Create a "created" attribute for the <root> element, and
// assign the "using dom" character data as the attribute value.
bstr = SysAllocString(L"created");
var = VariantString(L"using dom");
HRCALL(pXMLDom->createAttribute(bstr,&pa), "");
HRCALL(pa->put_value(var), "");
HRCALL(pRoot->setAttributeNode(pa, &pa1), "");
AppendChildToParent(pRoot, pXMLDom);
SysFreeString(bstr);
bstr=NULL;
if (pa1) {
pa1->Release();
pa1=NULL;
}
pa->Release();
pa=NULL;
VariantClear(&var); // Next, we will create and add three nodes to the <root> element. // Add NEWLINE+TAB for identation before <node1>.
AddWhiteSpaceToNode(pXMLDom, bstr_wsnt, pRoot);
// Create a <node1> to hold text content.
bstr = SysAllocString(L"node1");
HRCALL(pXMLDom->createElement(bstr,&pe),"");
SysFreeString(bstr);
bstr=NULL; bstr=SysAllocString(L"some character data");
HRCALL(pe->put_text(bstr), "");
SysFreeString(bstr);
bstr=NULL; // Append <node1> to <root>.
AppendChildToParent(pe, pRoot);
pe->Release();
pe=NULL;
// Add NEWLINE+TAB for identation before <node2>.
AddWhiteSpaceToNode(pXMLDom, bstr_wsnt, pRoot);
// Create a <node2> to hold a CDATA section.
bstr = SysAllocString(L"node2");
HRCALL(pXMLDom->createElement(bstr,&pe),"create <node2> ");
SysFreeString(bstr);
bstr=NULL; bstr = SysAllocString(L"<some -up text>");
HRCALL(pXMLDom->createCDATASection(bstr,&pcd),"");
SysFreeString(bstr);
bstr=NULL;
if (!pcd) goto clean; AppendChildToParent(pcd, pe);
pcd->Release();
pcd=NULL;
// Append <node2> to <root>.
AppendChildToParent(pe, pRoot);
pe->Release();
pe=NULL; // Add NEWLINE+TAB for identation before <node3>.
AddWhiteSpaceToNode(pXMLDom, bstr_wsnt, pRoot); // Create <node3> to hold a doc fragment with three sub-elements.
bstr = SysAllocString(L"node3");
HRCALL(pXMLDom->createElement(bstr,&pe),"");
SysFreeString(bstr);
bstr=NULL; // Create a document fragment to hold three sub-elements.
HRCALL(pXMLDom->createDocumentFragment(&pdf), ""); // Add NEWLINE+TAB+TAB for identation before <subnode1>.
AddWhiteSpaceToNode(pXMLDom, bstr_wsntt, pdf); // Create <subnode1>.
bstr = SysAllocString(L"subnode1");
HRCALL(pXMLDom->createElement(bstr,&peSub), "");
SysFreeString(bstr);
bstr=NULL; // Add <subnode1> to pdf.
AppendChildToParent(peSub, pdf);
peSub->Release();
peSub=NULL; // Add NEWLINE+TAB+TAB for identation before <subnode2>.
AddWhiteSpaceToNode(pXMLDom, bstr_wsntt, pdf); // Create and append <subnode2>.
bstr = SysAllocString(L"subnode2");
HRCALL(pXMLDom->createElement(bstr,&peSub), "");
SysFreeString(bstr);
bstr=NULL; // Add <subnode1> to pdf.
AppendChildToParent(peSub, pdf);
peSub->Release();
peSub=NULL; // Add NEWLINE+TAB+TAB for identation before <subnode3>.
AddWhiteSpaceToNode(pXMLDom, bstr_wsntt, pdf); // Create and append <subnode3>.
bstr = SysAllocString(L"subnode3");
HRCALL(pXMLDom->createElement(bstr,&peSub), "");
SysFreeString(bstr);
bstr=NULL;
if (!peSub) goto clean; // Add <subnode1> to pdf.
AppendChildToParent(peSub, pdf);
peSub->Release();
peSub=NULL; // Add NEWLINE+TAB after </subnode> in pdf.
AddWhiteSpaceToNode(pXMLDom, bstr_wsnt, pdf);
// Append pdf to <node3> (pe).
AppendChildToParent(pdf, pe); // Append <node3> to <root>.
AppendChildToParent(pe, pRoot); // Add NEWLINE for identation before </root>.
AddWhiteSpaceToNode(pXMLDom, bstr_wsn, pRoot); HRCALL(pXMLDom->get_xml(&bstr), "dom->get_xml");
dprintf("Dynamically created DOM:\n%S\n", bstr); VariantClear(&var);
var = VariantString(L"dynamDom.xml");
HRCALL(pXMLDom->save(var), "");
dprintf("DOM saved to dynamDom.xml\n");clean:
if (bstr) SysFreeString(bstr);
if (bstr1) SysFreeString(bstr1);
if (&var) VariantClear(&var); if (pXMLDom) pXMLDom->Release();
if (pRoot) pRoot->Release();
if (pe) pe->Release();
if (peSub) peSub->Release();
if (pi) pi->Release();
if (pa) pa->Release();
if (pa1) pa1->Release();
if (pc) pc->Release();
if (pcd) pcd->Release();
if (pdf) pdf->Release(); CoUninitialize();
return 0;
}
http://www.vckbase.com/document/viewdoc/?id=1508
http://www.vckbase.com/document/viewdoc/?id=1286
http://www.vckbase.com/code/downcode.asp?id=1874baidu google csdn~~~-----------------------------------------------------------------------------------------------------------------------------------------
CSDN小猪手:方便查看,快速回复~~速度++~~~
下载:
http://www.vickyjam.com/blog/lbs/article.asp?id=165