十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
/***************
创新互联建站专注于铁岭企业网站建设,成都响应式网站建设公司,商城网站定制开发。铁岭网站建设公司,为铁岭等地区提供建站服务。全流程定制开发,专业设计,全程项目跟踪,创新互联建站专业和态度为您提供的服务
?xml version="1.0" encoding="utf-8"?
Cases
case
No001/No
CopyFile src="C:\test.txt" dest="D:\test.txt"/CopyFile
/case
case
No002/No
DelFileC:\test.txt/DelFile
/case
/Cases
*******************/
// 我们用MFC来读取上述xml,代码如下:
void ReadXml(CString strXmlPath)
{
MSXML2::IXMLDOMDocumentPtr pDoc;
::CoInitialize(NULL);
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if (!SUCCEEDED(hr))
{
MessageBox(_T("创建DOMDocument对象失败。\n请检查运行环境"), _T("错误"), MB_ICONERROR);
return;
}
// 读取xml
pDoc-put_async(VARIANT_FALSE);
VARIANT_BOOL bhr = pDoc-load((_variant_t)strXmlPath);
if (bhr != VARIANT_TRUE) {
MessageBox(_T("无法正确读取xml文件"), _T("错误"), MB_ICONERROR);
return;
}
// 根节点取得
MSXML2::IXMLDOMElementPtr root = pDoc-documentElement;
// 取得根节点的名字
_variant_t strRootName = root-nodeName;
_bstr_t wstrRootName(strRootName.bstrVal);
MSXML2::IXMLDOMNodeListPtr nodeList = root-GetchildNodes();//cases
// 解析cases的子节点
ReadCases(nodeList);
}
void ReadCases(MSXML2::IXMLDOMNodeListPtr nodeList)
{
int ilength = nodeList-Getlength();
for (int nodeCount = 0; nodeCount ilength; nodeCount++) {
MSXML2::IXMLDOMNodePtr nodePtr = nodeList-nextNode();
_variant_t strNodeName = nodePtr-GetnodeName();
_variant_t strNodeValue = nodePtr-GetnodeValue();
// 读取case节点下的子节点
ReadCase(nodePtr-GetchildNodes());
}
}
void ReadCase(MSXML2::IXMLDOMNodeListPtr nodeList)
{
CString strLogInfo;
strLogInfo.Empty();
CString strNo; // case编号
CString strSrcFile; // 源文件
CString strDestFile; // 目标文件
for (int nodeCount = 0; nodeCount nodeList-Getlength(); nodeCount++)
{
MSXML2::IXMLDOMNodePtr nodePtr = nodeList-nextNode();
_variant_t strCaseNodeName = nodePtr-GetnodeName();
_variant_t strCaseNodeValue = nodePtr-Gettext();
BSTR bStrTemp = strCaseNodeName.bstrVal;
CString strTemp = CString(bStrTemp);
SysFreeString(bStrTemp);
CString strNodeName = strTemp;
// 节点的值,如何取得?
if (0 == strNodeName.CompareNoCase(_T("NO")))
{
strNo = (BSTR)strCaseNodeValue.pbstrVal;
// 取得的值可以打印出来
printf(strNo);
}
// 节点有属性值,该怎么处理?
else if (0 == strNodeName.CompareNoCase(_T("CopyFile")))
{
strSrcFile.Empty();
strDestFile.Empty();
// 取得节点的属性值
MSXML2::IXMLDOMNamedNodeMapPtr pDOMAttrList= nodePtr-Getattributes();
for (int j = 0; j pDOMAttrList-Getlength(); j++)
{
MSXML2::IXMLDOMNodePtr pDOMAttr= pDOMAttrList-Getitem(j);
// 取得源文件路径
if (CompareNoCase((char*)pDOMAttr-GetnodeName(), _T("src")))
{
strSrcFile = pDOMAttr-GetnodeTypedValue();
// 取得目标文件路径
} else if (CompareNoCase((char*)pDOMAttr-GetnodeName(), _T("dest")))
{
strDestFile =pDOMAttr-GetnodeTypedValue();
}
CopyFile(strSrcFile, strDestFile, FALSE);
}
else if (0 == strNodeName.CompareNoCase(_T("DelFile")))
{
strDestFile.Empty();
strDestFile = CString((BSTR)strCaseNodeValue.pbstrVal);
DeleteFile(strDestFile);
}
}
}
// 为了能够让MFC认识MSXML2,我们需要引入相应的dll,代码如下;
#import "msxml4.dll"
用微软的 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
// 创建解析器实例
CComPtrIXMLDOMDocument 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");
CComPtrIXMLDOMNodeList spParagraphs;
spParagraphs=spXMLDOM-getElementsByTagName(bstrSS); //搜索"Paragrah"
//是否正确的得到了指向IDOMNodeList的指针。
hr = spParagraphs-get_length(value); //得到所包含的NODE节点的个数
if(SUCCEEDED(hr))
...{
spParagraphs-reset();
for(int ii=0; iivalue; ii++)
...{
CComPtrIXMLDOMNode spParagraph;
//得到具体的一个NODE节点
// hr = spParagraphs-get_item(ii,spParagraph);
spParagraph = spParagraphs-nextNode();
if(SUCCEEDED(hr))
...{
spParagraph-get_text(bstrItemText); //得到该节点相关的文本信息
strbuf += bstrItemText;
strbuf += " ";
}
}
}
两种方式: 1、使用xmldocument类加载这个xml,然后调用其成员函数查找你要的节点。 2、在vs中打开这个xml文件,在xml菜单中选择生成架构,将这个xsd保存为文件a.xsd,然后进入vs的命令行,进入a.xsd目录,调用“xsd.exe /c /n:MyNamespace a.xs
#include XMLDoc.hpp ——相关说明 _di_IXMLDocument 为模板类 typedef System::DelphiInterface IXMLDocument _di_IXMLDocument; _di_IXMLNode typedef System::DelphiInterface IXMLNode _di_IXMLNode; _di_IXMLNodeList 同 ——类方法 //设置参数 void TXXX::setOptions(String name,String value){ //创建文档对象 _di_IXMLDocument XMLDoc = LoadXMLDocument(L"文件路径"); XMLDoc-Active=true; //文档根节点 _di_IXMLNode root = XMLDoc-DocumentElement; //想要查找节点 _di_IXMLNode tempNode; //调用搜索方法 searchXml(name,root,tempNode); // 处理 if(tempNode!=NULL) tempNode-SetText(value); XMLDoc-SaveToFile(L"文件路径"); } //递归搜索参数节点树 void TXXX::searchXml(String name,_di_IXMLNode Parent_Node,_di_IXMLNode tempNode){ _di_IXMLNode Child_Node; //子结点 //子节点列表 _di_IXMLNodeList list = Parent_Node-ChildNodes; for(int i=0;ilist-Count;i++) { Child_Node = list-Get(i); //递归结束条件 if(Child_Node-GetNodeName()==name) { tempNode = Child_Node; break; } else { //递归函数 searchXml(name,Child_Node,tempNode); } } }