【问题标题】:Parse Xml File with C++使用 C++ 解析 Xml 文件
【发布时间】:2015-03-14 18:27:30
【问题描述】:

我的问题是我有一个大的 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

谢谢

问候

【问题讨论】:

  • @EdHeal 请检查我提供的链接而不是投票,我试图获得第一部分并寻求帮助来解决它,现在我问了第二部分然后我得到了答案来发布这个作为一个新问题,这就是我将其作为单独问题发布的原因。
  • 问题内容应该在问题中。

标签: c++ boost xml-parsing


【解决方案1】:

我建议您使用 XML 解析器来解析它。根据我的经验,对属性树进行这种查询并不实用。

如果您使用 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 等外部工具

¹ 只能用于标题,如 boost 属性树

【讨论】:

  • 感谢您的回复,我下载了 PugiXML Library for linux 并解压了它。我正在使用 eclipse,我正在将库路径添加到 pugixml 路径,但是 eclipse 无法检测到路径,在谷歌搜索时,我正在获取 Visual Studio 的库设置,而不是 Eclipse,请在此分享您的话问候。
  • 我使用 make 文件。在 debian 上,apt-get install libpugixml-dev 然后 g++ -std=c++11 test.cpp -lpugixml 完成这项工作。当然,您可以手动下载/安装,在这种情况下,./configure &amp;&amp; make installalternatively including the files into your project and defining PUGIXML_HEADER_ONLY 的常见问题应该可以完成这项工作
猜你喜欢
  • 2021-03-27
  • 2013-05-29
  • 2023-03-06
  • 2013-07-22
  • 1970-01-01
  • 2012-01-01
  • 2023-04-07
相关资源
最近更新 更多