c++ - 使用C++解析Xml文件

标签 c++ boost xml-parsing

我的问题是我有一个很大的xml文件,必须在C++中解析。
文件是b.xml,我必须从每个标签中获取消息子标签。
我的第一部分问题是:
https://stackoverflow.com/questions/27977851/parsing-xml-file-with-boost-c/27978152#27978152

<MultiMessage>
    <Message structID="1710" msgID="0" length="50">
        <structure type="AppHeader">
        </structure>
    </Message>
    <Message structID="27057" msgID="27266" length="315">
        <structure type="Container">
            <productID value="166"/>
            <publishTo value="xyz"/>
            <templateID value="97845"/>
            <sendingTime value="1421320622367060444"/>
            <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/>
        </structure>
    </Message>
</MultiMessage>
<MultiMessage>
    <Message structID="1710" msgID="0" length="50">
        <structure type="AppHeader">
        </structure>
    </Message>
    <Message structID="27057" msgID="27266" length="315">
        <structure type="Container">
            <productID value="166"/>
            <publishTo value="xyz"/>
            <templateID value="97845"/>
            <sendingTime value="1421320622367060444"/>
            <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/>
        </structure>
    </Message>
</MultiMessage>
<MultiMessage>
    <Message structID="1710" msgID="0" length="50">
        <structure type="AppHeader">
        </structure>
    </Message>
    <Message structID="27057" msgID="27266" length="315">
        <structure type="Container">
            <productID value="166"/>
            <publishTo value="xyz"/>
            <templateID value="97845"/>
            <sendingTime value="1421320622367060444"/>
            <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/>
        </structure>
    </Message>
</MultiMessage>

输出应为:
092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK
092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK
092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK

谢谢

问候

最佳答案

我建议您使用XML解析器对此进行解析。以我的经验,在属性树上进行这种查询是很麻烦的。

  • What XML parser should I use in C++?
  • What is the best open XML parser for C++?

  • 如果使用XPath,则只需在一行中完成所需的操作即可。例如。使用PugiXML¹:
    #include <pugixml.hpp>
    #include <iostream>
    
    int main() {
        pugi::xml_document doc;
        doc.load_file("input.xml");
    
        for (auto& n : doc.select_nodes("//root/MultiMessage/Message/structure/message/@value"))
            std::cout << n.attribute().value() << "\n";
    }
    

    版画
    092374nmkla90u345n09832ljkn0a9845jhklasdf09u8426ljakljdgf09845u6kljsdgp89u45ljsdfp9gu4569078ljk
    092374nmkla90u345n09832ljkn0a9845jhklasdf09u8426ljakljdgf09845u6kljsdgp89u45ljsdfp9gu4569078ljk
    092374nmkla90u345n09832ljkn0a9845jhklasdf09u8426ljakljdgf09845u6kljsdgp89u45ljsdfp9gu4569078ljk
    

    或者,使用外部工具,例如xmlstarletxmllint --xpath
    ¹只能用于 header ,例如boost属性树

    关于c++ - 使用C++解析Xml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27979067/

    相关文章:

    c++ - 使用 RapidXML 和 C++ 从 XML 文件构建树

    java - DOM paser setExpandEntityReferences(false) 生成实体引用和扩展文本节点

    java - 如何在 ANTLR 中分离出 block 的开始和结束标记

    android - 我需要 root 权限才能在 Android 下执行 native 应用程序?

    C++:Boost::asio:WAITING同一函数中的异步处理程序

    c++ - 我如何使用具有模板转换运算符的非模板代理对象来避免指定我的 boost::variant 的类型?

    c++ - 如何初始化作为类成员的 shared_ptr?

    c++ - 从 Vowpal Wabbit 中的内存读取数据?

    c++ - 在 Boost Spirit 中定义使用子解析器参数化的解析器

    c++ - 在 C++ 中,这段代码是什么意思?