如何在 C++ 中解析 XML 字符串中的数据

How to parse data from an XML string in C++?

本文关键字:XML 字符串 数据 C++      更新时间:2023-10-16

我有一个来自文件的字符串。例如,从XML文件。我只想知道格式化以下标签中内容的最简单方法是什么?

<member names="John:Frank" family="Smith:Wesson"/>

我只想要John Frank Smith Wesson,每个字符串都是不同的字符串。

使用 XML 解析器解析 xml,然后在 ':"?使用解析器作为 RapidXML

如果你喜欢Boost Spirit中的快速'n脏语法:

在科里鲁现场观看

#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
    std::string const example = "<member names="John:Frank" family="Smith:Wesson"/>";
    std::vector<std::string> data;
    if (qi::parse(begin(example), end(example).
             *(
                 qi::omit [ *~qi::char_('"') ] >> '"' >> qi::as_string [ *~qi::char_("":") ] % ':' >> '"'
              ),
             data))
    {
        for (auto const& item : data)
            std::cout << item << "n";
    }
}

输出

clang++ -std=c++11 main.cpp && ./a.out
John
Frank
Smith
Wesson

我会将 substr 与查找器结合使用

  • 查找字符串中的第一个"位置。
  • 从找到的第一个位置到从最后一个第一个位置找到的第一个位置的子字符串。您现在有 2 个仓位,开仓和平仓"
  • 根据:以与刚才相同的方式拆分生成的字符串。
  • 在字符串中有开始和关闭"时执行此操作

您的问题完全是关于字符串操作的,与 XML 解析无关。

要从<member names="John:Frank" family="Smith:Wesson"/>中获取四个名称非常容易,您只需要:

  1. <member names="John:Frank" family="Smith:Wesson"/>当成string

  2. 根据"找到两个大的子字符串,你会得到John:FrankSmith:Wesson

  3. 对于每个子字符串,根据:进一步拆分它们,你会得到JohnFrankSmithWesson。做!