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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)