在前面的章节里面,我完成了一个麻雀虽小但是五脏俱全的 Xml 解析库(额,也就一个类三个数据结构,叫作库真有些脸红 T_T)。那么我们那么辛苦地造出来了的轮子,不用来跑跑怎么行呢?

这里我使用了 SOUI 界面库,使用了 Scintilla 开源代码编辑组件,写出来了一个简略的 xml 解析软件。这个软件的效果图是这样的:

想要了解前面两章的同学可以点击这里:

XmlParser: 简易的 Xml 解析器的实现(一)
XmlParser: 简易的 Xml 解析器的实现(二)

准备好了的话,就开始吧:)

二、SOUI 界面库:强大友好的工具

这里我使用了 SOUI 界面库的模板快速地创建了工程,直接编写界面 xml 配置软件的界面显示,并且只需要简单的几段代码就可以完成界面控件的响应,实在是非常方便。

想要了解 SOUI 界面库的同学可以点击这里:
SOUI 是什么?

因为涉及到这个界面库的内容其实从零开始讲,内容还是不少的,但是这个项目中,也就仅仅用到了其中很少的地方,不过要细讲起来也要讲很多了,这与本篇博客以 xml 解析为主旨的目标不一致,故不详细解释了。想要了解的同学可以发挥自己强大的学习能力。

三、Scintilla:开源强大的代码编辑组件

Scintilla,如果你知道 NotePad++ 的话,应该对它不会陌生,因为 NotePad++ 就是使用了 Scintilla 来实现代码编辑功能的:

Scintilla是一个免费、跨平台、支持语法高亮的编辑控件。它完整支持源代码的编辑和调试,包括语法高亮、错误指示、代码完成(code completion)和调用提示(call tips)。能包含标记(marker)的页边(margin)可用于标记断点、折叠和高亮当前行。

想要详细了解的同学可以看看下列网址:

Scintilla

Scintilla开源库使用指南(一)

这个库里面涉及到的内容又会有很多呢,这里我直接参照了 SOUI 界面库里面的一个 demo,直接到里面拿走了一个代码编辑控件出来(嘿嘿,说出来真有点不好意思呢 ^_^),然后装到了自己的项目中使用了。

这里我能力有限,只能大概知道 Scintilla 的简单用法,不过这些用法在上述的第二个网址里已经讲述的非常清楚了,想必这里也没有必要赘述,也就不再详细讲述了。

四、TreeCtrl:Xml 树形结构显示

试问自己,什么样的控件最适合用来显示形结构?

看看我们自己的 QQ 的聊天框,你就会找到答案,使用类似聊天框的这种复杂控件,就可以实现复杂的树结构的显示。

这里我使用了 SOUI 界面库里面自带的 STreeCtrl 实现了树结构控件的显示。但是这里从我们的 Xml 结构到树结构控件中的对象的设置,还是有一些逻辑需要转换的。

这里简单粘贴下转换的逻辑代码:

// 显示:解析树
HRESULT CMainDlg::_ShowParseXmlTree(WangYingXmlParser::CDocument xmlDocument)
    SOUI::STreeCtrl *pTreeCtrl = FindChildByName2<SOUI::STreeCtrl>(L"tree_ctrl_xml");
    assert(pTreeCtrl != NULL);
    for (auto item : xmlDocument.items) {
        wchar_t  ws[512];
        swprintf(ws, 512, L"%hs", item.name.c_str());
        SOUI::HTREEITEM treeItem = pTreeCtrl->InsertItem(ws);
        for (auto subItem : item.subitems) {
            _ParseSubItem(subItem, treeItem, pTreeCtrl);
    return S_OK;
// 显示:解析项目
HRESULT CMainDlg::_ParseSubItem(WangYingXmlParser::CItem subItem, SOUI::HTREEITEM treeItem, SOUI::STreeCtrl *pTreeCtrl)
    assert(pTreeCtrl != NULL); 
    wchar_t  ws[512];
    swprintf(ws, 512, L"%hs", subItem.name.c_str());
    SOUI::HTREEITEM subTreeItem = pTreeCtrl->InsertItem(ws, treeItem);
    for (auto subsubItem : subItem.subitems) {
        _ParseSubItem(subsubItem, subTreeItem, pTreeCtrl);
    return S_OK;

第一个函数,站在最高层次的元素上进行解析,获取当前元素的层次标记(treeItem )之后,调用解析子元素的函数,也是差不多的逻辑,只是子元素的解析就会递归调用自己而已。

其实还是比较简单的。

总的来说,这一个 Xml 解析器软件包括了以下内容:

  1. SOUI 界面库:实现了界面显示的大部分逻辑

  2. Scintilla:实现了代码编辑框的显示逻辑

  3. XmlParser:我们自己写的 Xml 解析库,从代码编辑框中读取 Xml 代码,并解析出来,供 TreeCtrl 控件显示用

可以说除了最后一个 Xml 解析库是我自己写的以外,其他都是站在了大神的肩膀上呢^_^

至此,想要自己实现一个 Xml 解析器的目标总算是达成了。为此写了总数三期的系列博客,感觉学到了很多。

其实,最重要的还是 coding 的那种设计快感吧,是作为程序员不能舍弃的快乐。

最后的最后,附上整个系列的代码下载地址,欢迎参考拍砖:

wangying2016/WangYingXmlParser(解析库)

wangying2016/XmlParserDemo(本篇博客的 Xml 解析器软件项目)

一、引言在前面的章节里面,我完成了一个麻雀虽小但是五脏俱全的 Xml 解析库(额,也就一个类三个数据结构,叫作库真有些脸红 T_T)。那么我们那么辛苦地造出来了的轮子,不用来跑跑怎么行呢?这里我使用了 SOUI 界面库,使用了 Scintilla 开源代码编辑组件,写出来了一个简略的 xml 解析软件。这个软件的效果图是这样的:想要了解前面两章的同学可以点击这里:XmlParser: 简易的 Xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <students> <student id="00001" name="张" sex="男" birthday="2000-10-3"> <hobby>学习</hobby> <hobby>敲代码</hobby> <introdu :fire: Spring Boot应用程序将接受家谱格式的XML文档,将其解析并将其存储在数据库中。 :fire: XML文档采用以下格式: <? xml version = " 1.0 " encoding = " UTF-8 " ?> < entries> < entry>Adam</ entry> < entry xss=removed>Durim</ entry> < entry xss=removed>Nayla</ entry> < entry parentName = " Adam
一、引言工作中接触到 xml 的机会比较多,比如使用 xml 文件来配置界面显示。于是,也就慢慢萌生了想要自己去实现一个简易xml 解析器的想法。首先,让我们看看 xml 配置文件都长什么样子,这是来自 W3school 的示例 xml 代码:<note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Do
您好,关于xml_parser::read_xml抛出异常,我需要更多的上下文信息才能更好地回答您的问题。请问您能否提供更多关于这个问题的信息,例如: 1. 在什么情况下会抛出异常? 2. 异常的类型是什么? 3. 是否有其他错误信息或报错信息? 这些信息可以帮助我更好地理解您的问题并提供更准确的回答。
我也遇到这个问题,后来是发现安装了插件h-youhei/vim-ibus导致的,把插件禁用了就没事了。 另外,也可以参考这个文章:https://blog.csdn.net/ShenYuanLuo/article/details/47903945?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-47903945-blog-80693775.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-47903945-blog-80693775.235%5Ev38%5Epc_relevant_anti_t3&utm_relevant_index=6 让我们一步一步实现一个完整的 String 类:构造、拷贝、赋值、移动和析构 Qian Fa.: 为什么析构m_data的时候 ,可以加 [] 也可以不加??