怎样用vc++读写xml文件

怎样用vc++读写xml文件,第1张

用微软的 DOM,

MSXML4

//引入msxml4.dll

#import "C:/WINNT.0/system32/msxml4.dll"

//创建XMLDOMDocument指针

MSXML2::IXMLDOMDocumentPtr pXMLDoc

// 初始化COM接口

::CoInitialize(NULL)

// 通过智能指针创建一个解析器的实例

HRESULT hr

hr =pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30))

//加载文件

pXMLDoc->load("f://he.xml")

//在树中查找名为City的节点,"//"表示在任意一层查找

MSXML2::IXMLDOMElementPtr childNode

childNode = (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//AUTHOR"))

//得到节点类型

MSXML2::DOMNodeType nodeType

childNode->get_nodeType(&nodeType)

//节点名称

BSTR var

CString name

childNode->get_nodeName(&var)

name = (char*)(_bstr_t)var

//节点值

VARIANT varVal

childNode->get_nodeTypedValue(&varVal)

CString strValue = (char*)(_bstr_t)varVal

读属性:

//节点属性,放在链表中

MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL

MSXML2::IXMLDOMNodePtr pAttrItem

childNode = (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//NUM"))

childNode->get_attributes(&pAttrs)

long nCount

pAttrs->get_length(&nCount)

for(int i = 0 i < nCount i++)

{

pAttrs->get_item(i,&pAttrItem)

//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值

//也可以直接得到

CString strAttrName = (char*)(_bstr_t)pAttrItem->nodeName

CString strAttrValue = (char*)(_bstr_t)pAttrItem->nodeTypedValue

}

另外

可以用MSXML DOM

创建一个文档对象的过程。

HRESULT hr

IXMLDomDocument* pXMLDoc

IXMLDOMNode* pXDN

Hr=CoInitialize(NULL) //COM的初始化

hr=CoCreateInstance(CLSID_DOM Document,NULL,CLSCTX_INPPROC_SERVER,

IID_IXMLDOMDocument,(void**) &pXMLDoc)

hr=pXMLDoc->QueryInterface (IID_IXMLDOMNode,(void**)&pXDN)

使用文档中的createElement方法来创建一个节点装载和保存XML文件。通过load或者是loadXML方法可以从一个指定的URL来装载一个XML文档Save方法是用来把文档保存到一个指定的位置,用getElementsByTagName获得制定节点数据

二、

// 创建对象

CoInitialize(NULL)// 初始化COM

// 创建解析器实例

CComPtr<IXMLDOMDocument>spXMLDOM

BSTR bstrItemText

//long value

CString strbuf

HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument))

spXMLDOM->put_async(VARIANT_FALSE)

spXMLDOM->put_validateOnParse(VARIANT_FALSE)

spXMLDOM->put_resolveExternals(VARIANT_FALSE)

spXMLDOM->put_preserveWhiteSpace(VARIANT_TRUE)

_bstr_t path = _bstr_t(xmlPath)

// 装载XML文档。

hr=spXMLDOM->load(path)

// 1、读取里面全部文本

spXMLDOM->get_text(&bstrItemText)// new

strbuf = bstrItemText// new

// 2、读取一个节点

_bstr_t bstrSS("paragraph")

CComPtr<IXMLDOMNodeList>spParagraphs

spParagraphs=spXMLDOM->getElementsByTagName(bstrSS)//搜索"Paragrah"

//是否正确的得到了指向IDOMNodeList的指针。

hr = spParagraphs->get_length(&value)//得到所包含的NODE节点的个数

if(SUCCEEDED(hr))

...{

spParagraphs->reset()

for(int ii=0ii<valueii++)

...{

CComPtr<IXMLDOMNode>spParagraph

//得到具体的一个NODE节点

//hr = spParagraphs->get_item(ii,&spParagraph)

spParagraph = spParagraphs->nextNode()

if(SUCCEEDED(hr))

...{

spParagraph->get_text(&bstrItemText)//得到该节点相关的文本信息

strbuf += bstrItemText

strbuf += " "

}

}

}

利用MSXML解析XML文本(1)

XML DOM (文档对象模型)对象提供了一个标准的方法来 *** 作存储在XML文档中的信息,这就是DOM应用编程接口(API)函数。它是应用程序和XML文档之间的桥梁。DOM包含两个关键的抽象概念:一个是树状的层次结构,另一个是用来表示文档内容和结构的节点集合。树状层次包括了所有节点,节点本身也可以包含其他的节点。这样的好处是可以通过这个层次结构来找到并修改某一特定节点的信息。

----微软的MSXML解析器读取一个XML文档,然后把它的内容解析到一个抽象的信息容器中,该信息容器被称为节点(NODES)。这些节点代表文档的结构和内容,并允许应用程序来 *** 作文档中的信息而不需要知道XML的语义。一个文档被解析后,它的节点能够在任何时候被浏览而不需要保持一定的顺序。

----对开发人员来说,最重要的编程对象是DOMDocument。 DOMDocument对象通过暴露的属性和方法来允许浏览、查询和修改XML文档的内容和结构。

----本文主要介绍DOM的结构和应用,同时用VC编程语言给出了通过MSXML进行XML解析的实例。

DOMDocument对象的结构和应用

----文档对象的创建

HRESULT hr

IXMLDomDocument* pXMLDoc

IXMLDOMNode* pXDN

//COM的初始化

Hr=CoInitialize(NULL)

/*得到关于IXMLDOMDocument

接口的指针pXMLDOC*/

hr=CoCreateInstance(CLSID_DOMDocument,NULL,

CLSCTX_INPPROC_SERVER,IID_IXMLDOMDocument,

(void**)&pXMLDoc)

//得到关于IXMLDOMNode接口的指针pXDN

hr=pXMLDoc->QueryInterface(IID_IXMLDOM

Node,(void**)&pXDN)

----在MSXML解析器的使用过程中,我们可以使用文档中的CreateElement方法创建一个节点来装载和保存XML文件,也可以通过Load或者是 LoadXML方法从一个指定的URL来装载一个XML文档。Load(LoadXML)方法带有两个参数:第一个参数xmlSource表示需要被解析的文档,第二个参数isSuccessful表示文档装载是否成功。

----文档对象的保存

----Save方法是用来把文档保存到一个指定的位置。Save方法中参数destination用来表示需要被保存的对象的类型,对象可以是一个文件、一个ASP Response方法、一个XML文档对象,或者是一个能够支持持久保存(persistence)的客户对象。下面是使用Save方法的一个例子程序的部分代码:

BOOL DOMDocSaveLocation()

{

BOOL bResult = FALSE

IXMLDOMDocument *pIXMLDOMDocument = NULL

HRESULT hr

try

{

_variant_t varString = _T(“D:\\sample.xml")

/* 这里省略了创建一个DOMDocument

对象和装载XML文档的代码*/

//将文档保存到D:\\sample.xml中去

hr=pIXMLDOMDocument->save(varString)

if(SUCCEEDED(hr))

bResult = TRUE

}

catch(...)

{

DisplayErrorToUser()

/*这里省略了释放对IXMLDOMDocument

接口的引用的代码*/

}

return bResult

}

----设置解析标志

----在解析过程中,我们需要得到和设置解析标志。利用不同的解析标志,我们可以用不同的方法来解析一个XML文档。XML标准允许解析器验证或者不验证文档,允许不验证文档的解析过程跳过对外部资源的提取,还可以设置标志来表明是否要从文档中移去多余的空格。DOMDocument对象暴露了如下几个属性,允许用户在运行的时候利用它们改变解析器的行为。

Async属性方法:get_Async和put_Async。

ValidateOnParse属性方法:get_ValidateOnParse和 put_ValidateOnParse。

ResolveExternals属性方法:get_ ResolveExternals和put_ ResolveExternals。

PreserveWhiteSpace属性方法:get_ PreserveWhiteSpace和put_ PreserveWhiteSpace。

----每一个属性可以接受或者返回一个Boolean值。缺省情况下,Async、ValidateOnParse、ResolveExternals的值为TRUE,PreserveWhiteSpace的值跟 XML文档的设置有关,如果XML文档中设置了xml:space属性的话,该值为FALSE。

----在文档解析过程中可以收集到以下的信息:

doctype(文档类型):是用来定义文档格式的DTD文件。如果XML文档没有相关的 DTD文档的话,它就返回NULL。

implementation(实现):表示该文档的实现,用来指出当前文档所支持的XML的版本。

parseError(解析错误):指出在解析过程中最后所发生的错误。

readyState(状态信息):表示XML文档的状态信息。readyState对于异步使用微软的XML 解析器来说重要的作用是提高了性能。当异步装载XML文档的时候,程序可能需要检查解析的状态,MSXML提供了4个状态,分别为正在状态、已经状态、正在解析和解析完成。

url(统一资源定位):表示正在被装载和解析的XML文档的URL的情况。如果该文档是在内存中建立的话,这个属性返回NULL值。

----节点的 *** 作

---- 在得到文档树结构以后,我们可以 *** 作树中的每一个节点,一般通过两个方法得到树中的节点,分别为nodeFromID和getElementsByTagName。

---- nodeFromID包括两个参数,第一个参数idString用来表示ID值,第二个参数node返回指向和该ID相匹配的节点的接口指针。根据XML的技术规定,每一个XML文档中的ID值必须是唯一的,而且一个元素(element)只能和一个ID 相关联。

----getElementsByTagName方法有两个参数,第一个参数 tagName表示需要查找的元素(Element)名称,如果tagName为“*”则返回文档中所有的元素。第二个参数为resultList,它实际是指向接口IXMLDOMNodeList的指针,用来返回和 tagName(标签名字)相关的所有节点的集合。

----下面是相关例子程序的部分代码:

IXMLDOMDocument *pIXMLDOMDocument = NULL

wstring strFindText (_T(“author"))

IXMLDOMNodeList *pIDOMNodeList = NULL

IXMLDOMNode *pIDOMNode = NULL

long value

BSTR bstrItemText

HRESULT hr

try

{

/*此处省略创建一个DOMDocument

文档对象并装载具体文档的代码*/

/*下面的代码用来得到一个和标签名称


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11522086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存