怎样用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 += " "

}

}

}

用VC吧,下面有一个例子,你参照下:

void CreateXml()

{

    CoInitialize(NULL)

    // 创建文档

    MSXML2::IXMLDOMDocument2Ptr pXMLDoc = NULL

    //创建DOMDocument对象

    HRESULT hr = pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument))

    if (!SUCCEEDED(hr))

    {

        return

    }

    // Create the Processing Instruction

    MSXML2::IXMLDOMProcessingInstructionPtr pXMLProc = NULL

    pXMLProc = pXMLDoc->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")

    

    _variant_t vNullVal

    vNullVal.vt = VT_NULL

    pXMLDoc->insertBefore(pXMLProc, vNullVal)

    // 创建根结点

    _variant_t varNodeType((short)MSXML2::NODE_ELEMENT)

    MSXML2::IXMLDOMNodePtr pXMLNodeRoot= NULL 

    pXMLNodeRoot = pXMLDoc->createNode(varNodeType, _T("Cases"), _T(""))

    // 添加根结点

    pXMLDoc->appendChild(pXMLNodeRoot)

    // 创建并添加下级结点

    MSXML2::IXMLDOMNodePtr pXMLNodeNode= NULL 

    pXMLNodeNode = pXMLNodeRoot->appendChild(pXMLDoc->createElement(_T("Case")))

    // 创建下级元素结点

    MSXML2::IXMLDOMElementPtr pXMLEle = NULL

    pXMLEle = pXMLDoc->createElement(_T("CopyFile"))

    // 创建并设置下级结点属性

    MSXML2::IXMLDOMAttributePtr pXMLAttr = NULL

    pXMLAttr = pXMLDoc->createAttribute(_T("src"))

    pXMLAttr->nodeTypedValue = "C:\\test.txt"

    pXMLEle->attributes->setNamedItem(pXMLAttr)

    pXMLAttr = pXMLDoc->createAttribute(_T("dest"))

    pXMLAttr->nodeTypedValue = "D:\\Test.txt"

    pXMLEle->attributes->setNamedItem(pXMLAttr)

    // 添加元素结点

    pXMLNodeNode->appendChild( pXMLEle)

    MSXML2::IXMLDOMElementPtr pXMLEle1 = NULL

    pXMLEle1 = pXMLDoc->createElement(_T("DelFile"))

    pXMLEle1->appendChild(pXMLDoc->createTextNode("C:\\test.txt"))

    // 添加元素结点

    pXMLNodeNode->appendChild( pXMLEle1)

  

    // 保存文档

    pXMLDoc->save(_T("d:\\Test.xml"))

}

 

效果如下:

<?xml version="1.0" encoding="UTF-8" ?> 

<Cases>

    <Case>

        <CopyFile src="C:\test.txt" dest="D:\Test.txt" /> 

        <DelFile>C:\test.txt</DelFile> 

    </Case>

</Cases>

为了能够让MFC认识MSXML2,我们需要引入相应的dll,代码如下

#import "msxml4.dll"

需要使用SetAttribute方法

根据你的要求,我写了个示例.你看看

var xmldoc = new XmlDocument()

var xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, "", "")

xmldoc.AppendChild(xmlnode)

var xmlelem = xmldoc.CreateElement("", "ROOT", "")

xmldoc.AppendChild(xmlelem)

//创建Resolution节点

var xe1 = xmldoc.CreateElement("Resolution")

//设置具有指定名称的属性的值

xe1.SetAttribute("unit", "meter")

var xmltext = xmldoc.CreateTextNode("9.0000000000000000e+001")

xe1.AppendChild(xmltext)

xmlelem.AppendChild(xe1)

try{xmldoc.Save ( "c:\\data.xml" ) }

catch ( Exception ex )

{

MessageBox.Show(ex.Message)

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存