C++中DOM写XML (转载)
用MSXML 4.0:
1)用一般的指针
2)用智能指针,比较简单
下面的例子用智能指针:
步骤:
Programmatically, the dynamDOMsmart application performs the following steps:
- Creates an XML DOM instance (
pXMLDom
). - Calls the
createProcessInstruction
method onpXMLDom
. This creates a processing instruction node (pi
) targeted for XML 1.0. - Calls the
appendChild
method onpXMLDom
. This adds the processing instruction node (pi
) topXMLDom
. - Calls the
createComment
method on the DOM object (pXMLDom
) to create a comment node (pc
) and then append itpXMLDom
. - Creates a
<root>
element as the document element, with acreated
attribute whose value is set to a string value of"using DOM"
. Adds this element(<root>
) to the DOM object (pXMLDom
). - Creates a
<node1>
element with some character data as its content. Appends this element (pe
) to the document element (documentElement
) of the DOM object (pXMLDom
). - Creates a
<node2>
element that contains a CDATA section (pcd
) with markup text. Appends this element (pe
) to the document element (documentElement
) of the DOM object (pXMLDom
). - Creates a
<node3>
element that contains a DOM document fragment (pdf
). This fragment contains three other empty child elements:<subNode1>
,<subNode2>
, and<subNode3>
. The code then appends this element (pe
) to the document element (documentElement
) of the DOM object (pXMLDom
). - Saves this dynamically created DOM object to the project's main directory, and prints the XML data in the application console.
#include <stdio.h>
#import <msxml4.dll>
using namespace MSXML2;
int main(int argc, char* argv[])
{
IXMLDOMDocument3Ptr 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.
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.
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).
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.
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"));
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"));
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;
}
#import <msxml4.dll>
using namespace MSXML2;
int main(int argc, char* argv[])
{
IXMLDOMDocument3Ptr 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.
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.
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).
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.
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"));
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"));
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-----------------------------
在此过程中,经常会有一些错误:保存文件的路径,有的时候我写绝对路径,但是结果它却还是保存到相对路径,(为什么那?)还有里面的字符格式的转化,比较复杂,哈哈!欢迎大家来讨论:
哪位高手知道,关于保存路径的具体的东西啊,反正我发现相对路径有的时候并不总是相对你的原程序,当你打开文件处理在保存时,相对路径是相对你程序打开的文件的路径!
还有其他的吗,该轮到你们拉:
posted on 2005-12-29 09:48 梦在天涯 阅读(1531) 评论(8) 编辑 收藏 引用 所属分类: CPlusPlus 、UML/XML
评论
# re: C++中DOM写XML 2005-12-29 13:44 梦在天涯
为什么createelement(item)时,item不能是由数字转换为的字符串!而且是有时可以有时不可,都发现好多次拉,难道时bug,还是英文版的缘故啊? 回复 更多评论
# re: C++中DOM写XML 2005-12-29 14:53 小明
我来回答你
1.路径的问题
相对路径都是相对于当前的path,可能是可执行程序所在路径,跟源程序的路径无关,这对于任何win32的程序都一样
2.CreateElement为什么有时不能是数字?
因为xml的节点有些不能是数字
比如
<root>
<2>test</2>
</root>
不是有效的xml
而
<root>
<test>2</test>
</root>
就是有效的
回复 更多评论
# re: C++中DOM写XML 2005-12-29 16:09 梦在天涯
恩,太感谢拉!牛!
为什么说有些节点不能是数字那?是所有的吗?好像有的行啊!^_^!
哦,想起来拉,节点的命名首字母不能是()。。。。。。。^_^!~
但是element里的text,我们不用管它是中文还是英文,也不用管是身编码吗?只要我们在xml头指定encoding=“”就可以了吗?为什么有的时候加了encoding =“gb2312”,显示仍然是乱麻那~???
谢谢! 回复 更多评论
# re: C++中DOM写XML 2006-01-20 13:50 flying
我的编译通不过啊!!!
把IXMLDOMDocument3Ptr 改为IXMLDOMDocumentPtr能通过???
上面的例子就是SDK里面的吧! 回复 更多评论
# re: C++中DOM写XML 2006-01-20 15:22 flying
请助!
上面的代码编译不过,提示说IXMLDOMDocument3Ptr没有定义!
在system32中没有msxml4a.dll ,而msxml4.dll 和 msxml4r.dll有.
请问:是因为缺那个DLL造成编译通不过的吗?如果是,这么解决啊!
恳求大侠帮助!!!!!! 回复 更多评论
# re: C++中DOM写XML 2006-01-23 17:01 梦在天涯
是啊,要看你装的MSXML的版本啊,有的要用3,有的不用啊!
好像是这样啊! 回复 更多评论
# re: C++中DOM写XML 2006-02-08 20:50 梦在天涯
原程序对有些机器不能通过的原因:
应该把IXMLDOMDocument3Ptr中的3改为2!
还有虽然用了namespace MSXML2,但是还必须在每个用到的定义如IXMLDOMElementPtr 前加上MSXML2::,这样便可以通过!
有知道为什么的吗?
回复 更多评论
# re: C++中DOM写XML 2007-12-27 20:35 chenfeifei
怎么用C++解析xml文件呢?需要对xml文件提取每个行字符 请求帮助。谢谢
QQ:313054332