C++中处理XML文件
写Unmanaged Code在.NET时代成为一种很悲惨的事,当你需要处理XML文件时,这种感觉会变得尤其强烈。FCL中的System.XML多简单啊,连Steve Ballmer都知道怎么用。
事情不会总是那么理想的,假如你要在C/C++程序里处理XML怎么办呢?
选择一:市面上的XML lib还是有几个的,最有名的当然是libXML。我一年前用过,很不错,我还特意写了一份简明教程,后来不知搁哪儿了。
选择二:MS的MSXML,我要介绍的就是这个。
先说一下在MSDN哪里找文档吧,往下看的时候也好有个参考:在Index里打:Windows Media Services 9 Series SDK=>Programming Reference=>Programming Reference (C++)=>XML DOM Interfaces (C++)。什么?Windows Media?呵呵,不错,我觉得这个guide反而是最清楚的,你直接找MSXML,得到的结果,我觉得还没这个好。
在C程序里调用MSXML基本就是一堆COM接口,不过在Visual Studio里操作先要做点简单的设置:
在你的Project里Add References=>COM标签=>Microsoft XML v4.0,5.0其实也有了,但因为是和Office一起发布的,觉得有点怪,不想用,反正也未必用什么很怪异的功能,4.0可以了。
然后在加入这两行:
#include <msXML2.h>
#import <msXML4.dll>
头文件和dll库。什么?在哪里加?头文件或者c/cpp文件啊,哪里合适放哪儿。
然后就开始编程了,先定义两个必用的变量:
IXMLDOMDocumentPtr XMLFile = NULL;
IXMLDOMElement* XMLRoot = NULL;
为什么是必用的? 汗...
第一步当然是初始化COM:
if(FAILED(CoInitialize(NULL))) ....
接下来初始化XMLFile对象:
if(FAILED(XMLFile.CreateInstance("MsXML2.DOMDocument.4.0"))) ...
然后就可以加载XML文件了:
_variant_t varXML(L"C: est.XML"); //L for unicode
VARIANT_BOOL varOut;
XMLFile->load(varXML, &varOut);
取得root element:
XMLFile->get_documentElement(&XMLRoot))
取得第一级element:
IXMLDOMNodeList* XMLChildNodes = NULL;
XMLRoot->get_childNodes(&XMLChildNodes);
遍历所有第一级element:
IXMLDOMNode* currentNode = NULL;
while(!FAILED(XMLChildNodes->nextNode(¤tNode)) && currentNode != NULL)
{
//do something
}
取得当前element的名称:
BSTR nodeName;
currentNode->get_nodeName(&nodeName);
取得当前element的一个attribute(假设
相关文档:
加载外部的XML文件,文件名是1.xml;
<?xml version="1.0" encoding="utf-8"?>
<website>
<name a="名字1">周小川1</name>
<name a="名字2">周小川2</name>
<name a="名字3">周小川3</name>
<name a="名字4">周小川4</name>
<name a="名字5"> ......
偶然的因素,对const来了点兴趣,做了一下实验:
1. 语法:const、指针
在gcc中, 对于C语言,下面的语句是合法的:
const int a=0;
int *p=&a;
而C++中,需要手工强制转换才能编译通过:
......
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Xml;
private XmlDo ......
利用sqlhelper中的ExcuteXmlReader方法,读取数据并保存为xml文件
string strConn = Properties.Settings.Default.Connections;
SqlConnection connection = new SqlConnection(strConn);
& ......