在C++/MFC中利用CMarkup类对XML进行操作
标签: 实用编程技术
一、什么是XML1
XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分。标记语言从早期的私有公司和政府制定形式逐渐演变成标准通用标记语言(Standard Generalized Markup Language,SGML)、超文本标记语言(Hypertext Markup Language,HTML),并且最终演变成 XML。简单地说,XML是一种有特定格式的语言,这种语言可以精确的表示所记录的信息,最重要的是通用性很强,可以被多种软件或者系统按照语法格式来解析。
二、使用CMarkup类的一些准备
- 在官网下载头文件Markup.h和源文件Markup.cpp.
- 在VC6.0或者VS中新建一个工程,此处笔者在VC6.0中新建了一个简单地控制台应用程序,并将其命名为CMarkupTest
- 将下载头文件和源文件Copy到该工程的根目录下,并且添加到工程中去。这里需要说明的是VC6.0由于和office2007版本及以上版本在Windows中有冲突,向工程添加文件会使VC6.0卡死并且闪退,可以用加载插件的方法解决该问题,网上方法很多,在此不赘述。
- 在CMarkuptest.cpp中包含头文件Markup.h
点击编译,竟然有错误!我们来看一下提示:
fatal error C1010: unexpected end of file while looking for precompiled header directive
这是添加文件到工程常见的错误,解决方法有两个:
解决方案1: 在菜单栏进行设置,工程->设置->C/C++->分类:预编译的头文件,设置为第一项:不使用预补偿页眉
解决方案2:在CMarkup.cpp文件开头添#include”stdafx.h”
此处笔者使用解决方案2. 此时再编译,又提示了新的错误:
error LNK2001: unresolved external symbol __endthreadex
error LNK2001: unresolved external symbol __beginthreadex这个错误笔者以前在MFC中解析XML时并没有发生过,很可能是控制台应用程序没有包含应有的库而产生的。仔细观察提示的错误,未解决的外部符号__endthreadex/__beginthreadex,笔者猜测可能是解析XML时使用了多线程函数,这个好办,解决方法如下:
工程->设置->C/C++->分类:Code Generation->Use run-time library: DebugMultithreaded点击编译,0 error,完成!
三、创建XML文件2
XML 文档的第一行可以是一个 XML 声明。这是文件的可选部分,它将文件识别为 XML 文件,有助于工具和人类识别 XML。可以将这个声明简单地写成 <?xml?>
,或包含 XML 版本<?xml version="1.0"?>
,甚至包含字符编码,比如针对 Unicode 的<?xml version="1.0" encoding="utf-8"?>
。
根元素
根元素的开始和结束标记用于包围XML文档的内容,一个文件只能有一个根元素。
子元素
一个文件可以拥有若干个子元素,并且子元素可以嵌套新的子元素。创建名称时可以使用英文字母、数字和特殊字符,比如下划线(_)。下面给出命名时需要注意的地方:
- 元素名中不能出现空格。
- 名称只能以英文字母开始,不能是数字或符号。(在第一个字母之后就可以使用字母、数字或规定的符号,或它们的混合)。
- 对大小写没有限制,但前后要保持一致,以免造成混乱。
每一个元素以开始标记开始,以结束标记结束,中间夹上该元素的内容或者子元素。例如我们现在创建一个XML文档,来表示学生和课程内容。具体如下:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Math>
<Advanced_Mathematics>classroom No.1</Advanced_Mathematics>
<Mathematical_Analysis>classroom No.2</Mathematical_Analysis>
<Linear_Algebra>classroom No.3</Linear_Algebra>
<Probability_Theory>classroom No.4</Probability_Theory>
</Math>
<English/>
<Student>Xiao_Ming</<