肠子的小心思 pdf:vc中的XML编程心得【原创】,懿懿博客sss

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 05:36:11
vc中的XML编程心得【原创】 杭州浪子 发表于 2006-10-18 9:25:27

发现很多网上的XML资料都是抄袭的很厉害,个人在网上资料的基础上外加自己最近的一些心得总结了一下,写下了以下些内容,以便自己以后参考。

----------------------------------

1.XML标记都是大小写敏感的

2.文档的声明

XML标记说明它是一个XML文档,后面两个属性值表明了它的版本号和编码标准,standalone取yes表明该文件未引明其他外部XML文件

3.处理命令
格式:

4.注释
格式:

注释应注意的问题:
       1.注释不能出现在XML声明之前;
       2.注释不能出现在标记中;
       3.注释中不能出现连续两个连字符,即"--"  如:
       4.注释中可包含元素,但元素中不能包含"--"包含的元素解析时被忽略;
       5.注释不能嵌套;

5.元素与标记
 所有的XML文档必须有一个根元素。
 XML语法规范要求XML元素属性值必须用引号引着。
·格式:<标记 属性名1="值1".......>数据内容
XML元素是可以扩展的,它们之间有关联,XML元素有简单的命名规则:
Names can contain letters, numbers, and other characters (元素的名字可以包含子母,数字和其他字符。)
Names must not start with a number or punctuation character (元素的名字不能以数字或者标点符号开头。)
Names must not start with the letters XML (or XML or XML ..) (元素的名字不能以XML(或者XML,XML,XML...)开头。)
Names cannot contain spaces(元素的名字不能包含空格。)

6.语句的写法
 1.所有的标记都必须要有一个相应的结束标记;
 2.所有的XML标记都必须合理嵌套;
 3.所有XML标记都区分大小写;
 4.所有标记的属性必须用""括起来;

7.
 1.XML描述数据类型。例如:"King lear"是一个标题元素;
 2.CSS储存并控制元素的显示样式。例如:标题将被以18pt字体显示
 3.script脚本控制元素如何动作。例如:当一个title元素"out of stock",将被用红色显示。
 4.DOM则为脚本和对象的交流提供一个公共平台,并将结果显示在浏览器窗口。

8.调用DTD文件的方法有两种:

a.直接包含在XML文档内的DTD

你只要在DOCTYPE声明中插入一些特别的说明就可以了,象这样:

我们有一个XML文档:

XML轻松学习手册

ajie

我们在第一行后面插入下面代码就可以:

]>
 

b.调用独立的DTD文件

将DTD文档存为.dtd的文件,然后在DOCTYPE声明行中调用,例如,将下面的代码存为myfile.dtd


 

然后在XML文档中调用,在第一行后插入:

9.一个很严重的误区:在写XML文档时,不经意间把第一句“?”后面的xml写成了大写的,导致程序读写失败。应当引起注意!

10.关于XML的SDK,vc有自带的MSXML.H文件,但导入之后发现有写方法跟很多书上用的方法不一样,
#i nclude
#import named_guids
using namespace MSXML;
-----
上面的方法不可取,然后就使用下载的SDK。
#i nclude "C:\Program Files\Microsoft XML Parser SDK\inc\msxml2.h"
再在link中把.lib文件包含进来,基本上就能调用里面的接口函数了。

下面说一下using namespace MSXML;   使用这个是为了区分在不同的类里面存在同样的函数名或者在不同的函数里面存在不同的变量名。
反正就是为了防止混淆才使用这个方法的。

11.出错处理的代码:
    IXMLDOMParseError *pErr=NULL;
    BSTR bstr = NULL;

    pDoc->get_parseError(&pErr);
    pErr->get_reason(&bstr);
    CString strErr;
    strErr.Format("Load Failed ! %S", bstr);
    AfxMessageBox(strErr);

12.
关于BSTR类,在getElementsByTagName(BSTR tagName, IXMLDOMNodeList **resultList)方法中,tagName假如是CString类型则调用方法:AllocSysString()

在定义了一个BSTR变量后,要记得释放它  ::SysFreeString(bsText);

13.
hr = pDocument->put_async(VARIANT_FALSE);
hr = pDocument->put_validateOnParse(VARIANT_FALSE);
hr = pDocument->put_resolveExternals(VARIANT_FALSE);

a)添加子节点到父节点
pParent->appendChild(pChild, &pNode)

b)创建节点
VARIANT vtype;
vtype.vt = VT_I4;
V_I4(&vtype) = (int)type;
pDoc->createNode(vtype, bstrName, NULL, &pNode);

c)创建元素节点
pDoc->createElement(bstrName,pElement);
(pElement)->put_text(bstrText);

d)创建文本子节点,并添加到父节点中
pDoc->createTextNode(bstrText,&pText);
pParent->appendChild(pText,& pNode)

e)创建// Create a processing instruction element.
BSTR bstrTarget = SysAllocString(L"xml");
BSTR bstrData = SysAllocString(L"version=‘1.0‘");
pDoc ->createProcessingInstruction(bstrTarget, bstrData, &pProcessingInstruction);
SysFreeString(bstrTarget);
SysFreeString(bstrData);

f)创建注释节点
pDoc->createComment(bstrText, &pComment);

g)元素节点属性值
得到属性值
VARIANT v;
pEle->getAttribute(bstrName,&v);
CString str = v.bstrVal;
设置属性值
CComVariant v(str);
pEle->setAttribute(bstrName, v);

h)节点属性值
VARIANT v;
CString str;
long mCount;
得到节点属性集
hr=pNod->get_attributes(&pNodeMap);
hr=pNodeMap->get_length(&mCount);
得到节点属性
hr=pNodeMap->getNamedItem(bstrName,&pNode);
pNodeMap->get_item(i,&pNode);
得到节点属性值
hr=pNode->get_nodevalue(&v);
str =v.bstrVal;
删除节点属性
MSXML2::IXMLDOMNode *moldNode;
mNodeMape->removeNamedItem(bstrName,&moldNode);
if (moldNode!=NULL) moldNode->Release();

i)节点
(1)得到节点、节点集
根据节点名称
pDoc->getElementsByTagName(bstrName,&pNodeList);
pNodeList->get_item(0,&pNode);
得到子节点集
hr=pNod->get_childNodes(&mNodeList);
long mCount;
MSXML2::IXMLDOMNode *pNodeSub;
mNodeList->get_length(&mCount);
hr=pNode->get_firstChild(&pNodeSub);
删除子节点(包含删除节点属性、子节点、当前节点)
删除当前子节点
pNodeList->get_item(i,&pNode);
pNod->removeChild(pNode,&moldNode);
moldNode->Release();

(2)根据节点得到节点名称
pNod->get_nodeName(&bstrName);
(3)根据节点得到节点值
VARIANT v;
hr=pNod->get_nodevalue(&v);


j)XML文件操作
加载
VARIANT_BOOL status;
VARIANT vFileName;
(1)
pDoc->loadXML(bstrName,&status);
(2)
V_BSTR(&vFileName) = strFileName.AllocSysString();
V_VT(&vFileName) = VT_BSTR;
vResult = pDoc->load(vFileName,&status);
保存
BSTR pBFName = mFileName.AllocSysString();
CComVariant v(pBFName);
hr=pDoc->save(v);


BSTR bstr = NULL;
pDoc->get_xml(&bstr);


k)错误处理
BSTR bstr = NULL;
pDoc->get_parseError(&pObjError);
pObjError->get_reason(&bstr);
AfxMessageBox(_T("Failed to load DOM from books.xml. %S\n"),*bstr);

 

14.
/*****************************************************************
//据有关文档介绍,以下一段来移除安全性的问题,但是实际发现根本不需要
  IObjectSafety *pSafety;
  DWORD dwSupported, dwEnabled;

  if ( SUCCEEDED(iXMLDoc->QueryInterface(
         IID_IObjectSafety, (void**)&pSafety)))
  {
   pSafety->GetInterfaceSafetyOptions(
      MSXML::IID_IXMLDOMDocument, &dwSupported, &dwEnabled );
   pSafety->SetInterfaceSafetyOptions(
      MSXML::IID_IXMLDOMDocument, dwSupported, 0 );
  }
*******************************************************************/
iXMLDoc->loadXML(L"Don
      L"Hall
", 
      &tEmpty);
  iXMLDoc->get_documentElement(&iXMLElm);
  iXMLElm->get_childNodes(&iXMLChild);
  iXMLChild->get_item(1,&iXMLItem);
  iXMLItem->get_xml(&bStr);
  MessageBox(NULL,bStr,TEXT("Caption"),MB_OK);

15.
使用过程中,有以下几个方法是经常用到的。
iXMLDoc->getElementsByTagName(L"PDATXL",&iXMLList);  //查找某个结点
iXMLList->get_length(&iLength_Person);  //取得结点链长度
iXMLList->get_item(i,&iXMLNode);    //获取结点链中的某一个结点
iXMLNode->get_firstChild(&iXMLNode2);   //选中某个结点的第一个子结点
iXMLNode->get_lastChild(&iXMLNode2);   //选中某个结点的最后一个子结点
iXMLNode->selectSingleNode(L"姓名",&iXMLNode2); //按名选择子结点
iXMLNode2->get_text(&bStr);   //获取结点的内容
iXMLNode->get_attributes(&iXMLMap);    //获取节点的属性链