QQ登录

只需一步,快速开始

MSXML自学教程用户手册实例源码下载

[ 复制链接 ]
MSXML自学教程用户手册实例源码下载

MSXML是微软的一款产品,第一次接触,这里将自学过程遇到知识点及相关自学资源整理。

供日后自己二次使用,也方便本网站会员共同学习与使用。这里的资源是指其SDK开发手册,实例源源代码等。

msxml指微软的xml语言解析器,自然是用来解释xml语言。
保存到文件的数据结构类似下图。

MSXML自学教程用户手册实例源码下载

MSXML自学教程用户手册实例源码下载


从首版发布到今天2020,10,11日,网络已流传众多版本,如,2,3,4,6版本。
我刚接触也不知道使用哪个好,按照以往自学经验,挑一个使用人较多的版本好,
自学资源与问题都好解决。

搜索网络,能找到的教程挺少的。
下面从头开始记录自己自学过程。

本人电脑WIN10,64位,熟悉MFC,所以自学也其于此。
打开C盘搜索关键字msxml,可以找到很多相关动态库文件。
如:msxml.dll,msxml2.dll,msxml4.dll等在目录C:\Windows\SysWOW64,
如:msxml3.dll,msxml6.dll等在目录C:\Windows\System32。

这里我挑选使用版本为4的。
所以可以在stdafx.h头文件尾部,引入此文件。
#import <msxml4.dll>

msxml对应会有一好些函数,函数参数含义不明,有时有查询其API需要。
网络一般都有提供下载,但很多要积分,实在麻烦。
也可以在自己安装msxml时选择安装其文档。
比如到微软官网下载地址.
https://www.microsoft.com/zh-cn/ ... ation.aspx?id=19662
见面提示文本如下。
感谢下载 MSXML 4.0 Service Pack 2 (Microsoft XML Core Services)

下载后安装时,选择自定义安装,选择安装文档就好。
打开安装目录下文档文件夹,如C:\Program Files (x86)\MSXML 4.0\doc。
就可以找到帮助文件,如xmlsdk4.chm,及xmlsdk4.chi,另存使用就好。

手册可自己提取,下面是我提取的XMLSDK4.CHM,供懒人下载。
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:Softwares.rar 
文件大小:3.18 MB 
下载权限: 捐助会员 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



手册上对XML的介绍。
下面都是从手册翻译而来,是对一些相关术语概念的介绍。第一次接触XML可能会对一些名词术语陌生,我也就仔细看了看。
可自己翻阅手册看英文版本,我也是英中文翻译着看。
要看与下载例程,直接拖到尾部就好,有两个供下载。


从表面上看,XML看起来像HTML。
它们都是从标准的通用标记语言(SGML)派生出来的。
生成HTML的工具通常可以重用来生成XML。
XML与HTML在两个关键方面不同:语法和语义。

XML语法格式更加紧凑。
HTML和XML都使用<、>和&来创建元素和属性结构。
虽然HTML浏览器接受或忽略损坏的标记语言,
但XML解析器和基于这些解析器构建的应用程序就不那么宽容了。
XML语法中的错误会中断文档处理,用户或应用程序会收到错误消息,
而不是对文档结构的最佳猜测解释。


XML文档必须是格式完好的。
也就是说,它们必须遵循识别文档部件和创建嵌套元素结构的规则。
这些规则包括:


一个XML文档只能有一个document元素。
document元素是一个单独的元素,它包含文档所有内容。
此文档root元素是文档的第一个元素。有关详细信息,可参见Elements介绍。


所有XML元素都必须有结束标记。
对于某些HTML元素,结束标记可能是可选的,但是XML中的所有元素都必须有一个结束标记。
有关详细信息,可参见Elements介绍


XML元素不能重叠。
如果一个元素的开始标记出现在另一个元素中,那它必须在相同元素中结束。
例如,下面的HTML代码建议通过重叠结构将粗体和斜体组合起来。
  1. <b>This is bold text. <i>This is bold italic text.</b> This is italic text.</i>
复制代码

但是,在XML解析器中,一旦遇到</b>,所有处理都会立即停止,
因为XML解析器正在寻找</i>,并且不会接受</b>。
要在XML中实现相同的格式,请使用以下语法。
  1. <b>This is bold text.</b> <i><b>This is bold italic text.</b> This is italic text.</i>
复制代码
虽麻烦些但执行效率要高很多。
因为XML处理器的“猜测”代码要少得多,所以它们更容易适应更小规模的处理,比如嵌入式系统。
从XML文档中消除了结构上的歧义—--所有XML解析器都看到相同的嵌套元素结构.

所有属性值都必须用引号引起来,无论它们是否包含空格。
你仍然可以选择单引号或双引号。
有关详细信息,请参见Attributes介绍。

不能在文档文本中使用<、>或&字符。
使用内置实体<;、>;和&;。
有关详细信息,请参见Character , Entity References两部分介绍。

尽管XML对语法不宽容,但它为开发人员提供了在XML文档中定义含义的更多选项。
HTML基本上是一个词汇表,有一些变体;<b>对HTML处理器来说总是相同的。
使用XML,您可以创建自己的标记词汇表,也可以从适合您的行业或项目类型的标记词汇表中进行选择。
模式和文档类型定义(DTD)允许您描述这些词汇表,但是您也可以使用没有正式定义的词汇表来创建文档。
名称空间可以帮助您识别所使用的词汇表。

XML优点。
在某些方面,XML只是另一种数据格式。
然而,与其他格式相比,XML在存储信息时有几个优势。
XML允许开发人员创建自己的标记结构来存储信息。
XML解析被广泛地定义为在各种XML文档中检索信息提供了可能。
XML是建立在Unicode基础上的,使得创建国际化文档更容易。
应用程序可以依赖XML解析器进行一些结构验证,以及数据类型检查(当使用模式时)。
XML格式是基于文本的,这使得它们更易读、更易于编写文档,有时也更易于调试。
不同平台上的XML处理工具都是可用的,这使得使用XML而不是二进制格式来交换复杂的信息流变得更加简单。
XML文档可以使用已经为HTML构建的许多基础设施,包括HTTP协议和一些浏览器。

然而,XML并不适合所有情况。
XML文档往往比它们所替代的二进制格式更加冗长。
它们会占用更多的网络带宽和存储空间,或者需要更多的处理器时间进行压缩。
XML解析可能比解析高度优化的二进制格式慢,并且可能需要更多内存。
然而,可能通过应用程序代码上的设计避免这些问题。

手动创建一个简单的XML文件。
下面演示如何创建一个包含基本信息的XML文档:
  • Name
  • Home Address
  • Job Title
  • Salary
文档全包含简单的员工信息:
Shane S. Kim1234 South StreetAnywhere, NY 10001USAVice President of Finance$175,000
文档内容结构如下
<employeeRecord><name>Shane S. Kim</name><homeAddress>1234 South StreetAnywhere, NY 10001USA</homeAddress><jobTitle>Vice President of Finance</jobTitle><salary>$175,000</salary></employeeRecord>
元素的开头用开始标记标记如
<employeeRecord>,结尾则对应</employeeRecord>.所有元素都正确嵌套。
任何元素有包含另一个元素的开始标记,就得包含其结束标记,不可相互嵌套。
<name>和 <homeAddress> 元素包含的信息有助于排序与搜寻。
如,按姓氏排序列表或查找居住在某个国家/地区或邮政编码的所有员工。
我们可以在name元素内添加<givenName>, <middleName>, <familyName>子元素。
形式如下:
<name><givenName>Shane</givenName> <middleName>S.</middleName> <lastName>Kim</lastName></name>我们也可添加更多信息到home address 元素内。形式如下:<homeAddress><street>1234 South Street</street><city>Anywhere</city>, <stateProvince>NY</stateProvince> <postalCode>10001</postalCode><country>USA</country></homeAddress>那么XML文档的最终内容如下:
<employeeRecord><name><givenName>Shane</givenName> <middleName>S.</middleName> <lastName>Kim</lastName></name><homeAddress><street>1234 South Street</street><city>Anywhere</city>, <stateProvince>NY</stateProvince> <postalCode>10001</postalCode><country>USA</country></homeAddress><jobTitle>Vice President of Finance</jobTitle><salary>$175,000</salary></employeeRecord>上版本中,元素结构标识所有文档内容。但如果我们的内容可能不属于文档,或者可能永远不需要包含,那么我们可以使用一个属性。例如,如果这家公司以多种货币支付工资,那么在这里显示的工资是以美元而不是加拿大元为单位可能更有意义。salary元素上的currency属性允许我们表示如下。
  1. <salary currency="USD">$175,000</salary>
复制代码
类似的,<employeeRecord>元素上的employeeID属性可以更容易地操作员工记录文档,尤其是当我们必须将多个记录合并到一个XML文档中时,我们可以修改为如下:<employeeRecord employeeID="2344-12Z">
现在最终XML文件内容如下<employeeRecord employeeID="2344-12Z"><name><givenName>Shane</givenName> <middleName>S.</middleName> <lastName>Kim</lastName></name><homeAddress><street>1234 South Street</street><city>Anywhere</city>, <stateProvince>NY</stateProvince> <postalCode>10001</postalCode><country>USA</country></homeAddress><jobTitle>Vice President of Finance</jobTitle><salary currency="USD">$175,000</salary></employeeRecord>
将此内容复制粘贴到txt文件内,修改后缀txt为xml,便可双击或直接拖拽到浏览器打开查看效果。


XML文档相关概念。
XML文档读写编程前,应当了解文档的相关概念,如节点元素标识啥的,编程时才可得心应手。

元素
元素构成XML文档的主干,创建了可用程序或样式表单操作的结构。元素区分文档中已命名部分的信息,由名称、开始,结束标签组成。
元素也可包含属性名与属性值以附加更多额外信息。有关详细信息,请参见Attributes介绍。所有元素都必须有名称。
元素名称区分大小写,必须以字母或下划线开头。
元素名称可以包含字母、数字、连字符、下划线和句点。
注意:
冒号是为与命名空间一起使用而保留的。
有关哪些Unicode字符是可接受的字母和数字的更多信息,可以参阅XML规范的附录B,初始使用可忽略。


关于开始,结束,空标记。
标记用于确定一内容的边界。
开始标记指示元素的开始,并使用以下通用语法。
<elementName att1Name=“att1Value”att2Name=“att2Value”…>
对于没有属性的元素,可以减少起始标记。
<elementName>
结束标记指示元素的结尾,不能包含属性。结束标记总是采用以下形式。
</elementName>

元素通常被认为包括开始和结束标记,以及两者之间的所有内容。
<person>
<givenName>eter</givenName>
<familyName>Kress</familyName>
</person>

上边<person>元素包含另外两个元素,<givenName>和<familyName>,还有一个分隔它们的空格。
<givenName>元素包含文本Peter,而<familyName>元素包含文本Kress。

空标记用于指示没有文本内容的元素,尽管它们可以具有属性。
html中,img和br元素是空元素示例。
当文档的开始标记和结束标记之间没有内容时,可以将空标记用作快捷方式。
空标记看起来像开始标记,只是它们在结束>之前包含斜杠(/)。
如:<elementName att1Name=“att1Value”att2Name=“att2Value”../>
在XML中,可以用开始和结束标记来表示空元素,中间没有空格或内容,例如,<giggle></giggle>。
也可以使用空标记,例如<giggle/>。这两种形式在XML解析器中产生相同的结果。

元素间关系
元素之间的关系可用家谱或树枝干来比喻。
XML文档必须包含文档元素(也称为根元素)。
尽管可以在其前面和后面加上其他标记,例如声明、处理说明、注释和空白,根必须包含被视为文档本身一部分的所有实质内容。
例如,下面的代码可以是一个以<person>为根元素的XML文档。

<person><givenName>Stephanie</givenName> <familyName>Bourne</familyName></person>
以下片段不能是XML文档,因为它有多个根元素。
<givenName>Stephanie</givenName>
<familyName>Bourne</familyName>

注意文档片段可以作为XML文档的一部分使用,但不应该单独传递给解析器。
当解析器遇到第二个元素或元素外部的文本时,它将报告一个错误。

序言
序言是指出现在文档或根元素的开始标记之前的信息。
它包括应用于整个文档的信息,例如字符编码、文档结构和样式表.
如:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="show_book.xsl"?><!DOCTYPE catalog SYSTEM "catalog.dtd"><!--catalog last updated 2000-11-01-->处理指令也可以出现在序言中例如xml-stylesheet,<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>. 注释可以出现在序言中,如<! — catalog last updated 2000-11-01--!>.

XML声明
XML声明通常显示为XML文档中的第一行。但是,XML声明可有可无,如果使用它,它必须是文档中的第一行,前面不能有其他内容或空白。文档映射中的XML声明包含以下内容:
版本号:<?xml version="1.0"?>.
编码申明:<?xml version="1.0" encoding="UTF-8"?>

编码申明也是可选的。如果使用,编码声明必须紧跟在XML声明中的版本信息之后,并且必须包含表示现有字符编码的值。

XML声明也可以包含独立的声明,
例如<?xml version=“1.0”encoding=“UTF-8”?standalone=“是”?>.
与编码声明一样,独立声明也是可选的。
如果使用,独立声明必须出现在XML声明的最后。


编码声明
编码声明标识用于表示文档中字符的编码。
尽管XML解析器可以自动确定文档是使用UTF-8还是UTF-16 Unicode编码,但是这种声明应该在支持其他编码的文档中使用。
例如,下面是使用ISO-8859-1(拉丁语1)的文档的编码声明。
<?xml version=“1.0”encoding=“ISO-8859-1”?>
注意:编码声明不考虑指定值中的大小写。”“ISO-8859-1”相当于“ISO-8859-1”。
下面是使用日文编码方法Shift-JIS的文档的编码声明。
<?xml version=“1.0”encoding=“Shift-JIS”?>

独立声明
独立声明指示文档的内容是否依赖于外部源(例如外部文档类型定义(DTD))的信息。
如果独立声明的值为“yes”,例如,<?xml version=“1.0”standalone=“是”?>,
如果文档引用外部DTD或外部实体,则解析器将报告错误。
省略独立声明将产生与包含“no”独立声明相同的结果。
XML解析器将接受外部资源(如果有),而不报告错误。

另外可选的还有处理指令申明,DOCTYPE申明,注释等。
可选 的东西也就是可无的,自己有个印象就好,具体可参阅手册。

文本内容
由于支持Unicode字符集,所以XML支持一系列可示字符,包括字母、数字、标点符号和符号。
不允许使用大多数控制类字符和Unicode兼容字符。
有关字符类的完整列表,请参阅XML规范的附录B。
这都是常识性的东西,有些编程基础都不会犯错,这个概念有些印象就好。
要注意的是XML是通过<>&来限定标记的,
所以要显示这些字符的话,可以在后面介绍的主题中来表示这些字符,或者将它们限制在CDATA部分中。

字符和实体引用
字符和实体引用提供了通过引用而不是直接在文档中键入字符来包含XML文档中的信息的方法。
这在以下情况非常有用:
字符不能直接输入到文档中,因为它们将被解释为标记。
由于输入设备的限制,无法将字符直接输入到文档中。
字符不能通过仅限于一个字节字符的处理器可靠地传输。
字符串或文档片段重复出现,并且可以缩写。
对于内容表示,XML提供了许多以和号(&)开头、以分号(;)结尾的语法结构。

字符引用提供了一种插入由指向Unicode代码点的数字标识的Unicode字符的方法。
可以使用十进制或十六进制表示法来标识代码点。
&#值:用于十进制引用的语法。
&#X值:用于十六进制引用的语法。
例如,要插入Euro符号(许多键盘上仍然缺少的字符),可以在文档中插入。



例程下载与介绍;
其他对XML文件的操作很简单,熟悉INI文件操作,对XML理解很有帮助;
例程就两个按钮,实现数据与文件读取操作,界面如下。

MSXML自学教程用户手册实例源码下载

MSXML自学教程用户手册实例源码下载

例程使用VS2010编写,源代码下载地址:
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:XMLTest.rar 
文件大小:68.25 KB 
下载权限: 捐助会员 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


对应代码如下:
  1. void CXMLTestDlg::OnBnClickedOk()
  2. {
  3.         //<>创建XML文件并写入相关自定义内容;
  4.         MSXML2::IXMLDOMDocumentPtr pDoc;//定义文档对象;
  5.         MSXML2::IXMLDOMElementPtr xmlRoot;//定义根节点对象;
  6.         MSXML2::IXMLDOMElementPtr pNode;//定义子节点对象;
  7.         CString sRootAttr=_T("Root_ID");
  8.         //<>创建DOMDocument对象;
  9.         HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
  10.         if(!SUCCEEDED(hr))
  11.         {
  12.                 MessageBox(_T("无法创建DOMDocument对象!") );
  13.                 return ;
  14.         }
  15.         //<> 创建根节点,名称为Book,设置其属性,并添加到文档中;
  16.         xmlRoot=pDoc->createElement((_bstr_t)_T("XMLRoot"));
  17.         xmlRoot->setAttribute((_bstr_t)sRootAttr,(const char *)_T("3838438"));//设置根节点属性;
  18.         xmlRoot->setAttribute((_bstr_t)_T("Version"),(const char *)_T("1234"));//可含多节点属性;
  19.         pDoc->appendChild(xmlRoot);//添加根节点到文档中;

  20.         //<>创建一子节点“author”,设置其文本,存到根节点下;
  21.         pNode=pDoc->createElement((_bstr_t)_T("Author") );
  22.         pNode->Puttext((_bstr_t)(const char *)_T("vx263946146"));//设置子节点文本;
  23.         xmlRoot->appendChild(pNode);//将子节点添加天根节点;
  24.         //添加另一子节点“Title”;
  25.         pNode=pDoc->createElement((_bstr_t)_T("Title") );
  26.         pNode->Puttext((const char *)_T("gkbc8.com"));
  27.         xmlRoot->appendChild(pNode);

  28.         //<>保存DOMDocument对象到文件,如果不存在就建立,存在就覆盖;
  29.         pDoc->save("d:\\gkbc8.xml");
  30. }


  31. void CXMLTestDlg::OnBnClickedCancel()
  32. {
  33.         MSXML2::IXMLDOMDocumentPtr pDoc;
  34.         MSXML2::IXMLDOMNodePtr pNode;
  35.         MSXML2::DOMNodeType nodeType;
  36.         MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL;

  37.         HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
  38.         if(FAILED(hr))
  39.                 return;
  40.         pDoc->load("d:\\gkbc8.xml");
  41.         //<>在树中查找名为XMLRoot的节点,"//"表示在任意一层查找
  42.         pNode=pDoc->selectSingleNode(_T("//XMLRoot"));//根据名称获取指定名称节点如根节点;
  43.         pNode->get_nodeType(&nodeType);//得到节点类型;
  44.         nodeType = pNode->nodeType;//相同效果;
  45.         CString sTemp  = (char *)pNode->GetnodeName();//得到节点名称即:XMLRoot;
  46.         pNode->get_attributes(&pAttrMap);//此节点全部属性获取,放在链表中;
  47.         long AttrNum;
  48.         pAttrMap->get_length(&AttrNum);//此节点含子节点属性总数,返回S_OK表示成功;
  49.         for(int i=0;i<AttrNum;i++)//循环遍历此节点;
  50.         {
  51.                 pAttrMap->get_item(0,&pNode);//此节点第0个属性获取,此例中共添加2个;
  52.                 sTemp = (char *)(_bstr_t)pNode->GetnodeName();//节点属性名如:Root_ID;        
  53.                 sTemp = (char *)(_bstr_t)pNode->GetnodeValue();//节点第0属性值如:3838438
  54.         }
  55.         //<>可选操作;
  56.         pNode=pDoc->selectSingleNode(_T("//Author"));//根据名称获取指定名称节点;
  57.         sTemp = (char *)pNode->Gettext();//文件内容获取如vx263946146;
  58.         MSXML2::IXMLDOMElementPtr pNode1;
  59.         pNode1 = pDoc->GetdocumentElement();//获取根节点;
  60.     sTemp = pNode1->getAttribute(_T("Root_ID"));//值为3838438;
  61.     sTemp = pNode1->getAttribute(_T("Version"));//值为134;

  62.         CDialogEx::OnCancel();
  63. }
复制代码

其实实际中,XML常用到的功能没多少,
下边封闭了三个集成类,对应一个头文件与源文件XmlNodeWrapper.h,XmlNodeWrapper.cpp。
文件是基于MSXML3.dll版本的二次封闭,结合一小项目,演示这两文件的使用。
界面如下:

MSXML自学教程用户手册实例源码下载

MSXML自学教程用户手册实例源码下载

可以通过两按钮加载显示XML文件,保存XML文件。
具体使用方法也很简单,新建立自己的基于对话框工程。
添加上边两文件到自己项目工程,可以发现在自己项目中会多出三个集成类,
对应处理XML不同内容。

对话框头文件包含#include "XmlNodeWrapper.h",
给对话框界面资源添加打开,保存按钮,树状控件,控件外观样式可自行设置其属性。
再定义自定义变量与函数,记得再初始化这些变量。
初始化用于的图标可以例程由复制使用,注意图标加载后ID修改一致。
最后就是实现两个按钮的点击函数,函数具体定义可下载例程查看。
  1. private:
  2.         CTreeCtrl        m_tree;
  3.         void ParseNode(IDispatch* pNode,HTREEITEM hParent);
  4.         CXmlDocumentWrapper m_xmlDoc;
复制代码
  1. #define GETICONRESOURCE16(i) (HICON)LoadImage(AfxGetResourceHandle( ),MAKEINTRESOURCE(i),IMAGE_ICON,16,16,0)
  2.         CImageList iml;
  3.         iml.Create(16,16,ILC_COLOR32|ILC_MASK,4,1);
  4.         iml.Add(GETICONRESOURCE16(IDI_NODECLOSED));
  5.         iml.Add(GETICONRESOURCE16(IDI_NODEOPEN));
  6.         iml.Add(GETICONRESOURCE16(IDI_TEXT));
  7.         iml.Add(GETICONRESOURCE16(IDI_ATTRIB));
  8.         m_tree.SubclassDlgItem(IDC_TREE1,this);
  9.         m_tree.SetImageList(&iml,TVSIL_NORMAL);
  10.         iml.Detach();
复制代码
例程源代码下载。
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:MSXML自学教程源码下载.rar 
文件大小:83.87 KB 
下载权限: 捐助会员 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索