【问题标题】:TinyXML2 - Trouble Getting StartedTinyXML2 - 入门问题
【发布时间】:2018-02-01 22:39:02
【问题描述】:

我刚刚开始使用 XML 解析库,但在开始时遇到了麻烦。 (我猜是学习曲线)更具体地说,我在尝试获取元素并使用它时正在处理异常。现在我有这行:

tinyxml2::XMLElement *firstEvent = doc.FirstChildElement("EVENTS")->FirstChildElement();

这会引发内存异常。由于某种原因,我无法显示我的 XML 代码,但结构是

file->EVENTS->event->更多内容

所以在我看来,解析器无法访问“事件”元素。这可能是什么原因造成的?我究竟做错了什么?!任何帮助都会非常好!

【问题讨论】:

    标签: c++ xml tinyxml tinyxml2


    【解决方案1】:

    假设这是您的 xml 内容:

    <events>
      <event> "Move" <\event>
      <event> "Walk" <\event>
      <event> "Run" <\event>
    <\events>
    

    在迭代之前测试XmlElement是否不是NULL以避免抛出异常: C++ 代码 sn-p 可以如下所示:

    XmlElement* elem = doc.FirstChildElement("events");
    if(elem != NULL)
    {
       for (XmlElement* e = elem->FirstChildElement("event"); e != NULL; e = e->NextSiblingElement("event"))
       {
            const char *c = e->GetText(); // if its an attrib use e->Attribute("event-type");
            /* more  */
       }
    }
    

    【讨论】:

    • 好的,有道理!但这仍然不能解决问题。即使它不抛出异常,它也不会访问元素。为什么它不会访问那些? (是的,我的 XML 内容的描述是正确的。除了每个事件里面也有内容。)
    • 我现在实际上已经尝试过了,并且意识到异常是在定义本身中引发的,这意味着tinyxml2::XMLElement *firstEvent = doc.FirstChildElement("EVENTS")-&gt;FirstChildElement(); 是引发异常的行,因此永远无法运行 IF 语句不管……奇怪!有什么想法吗?
    • 您正在嵌套 FirstChildElement()。如果第一次调用返回 null,则将抛出异常,因为 null 对象正在尝试进行调用。 BTW 元素名称区分大小写。
    • 我发现只要让它进入“事件”而不进入内部(到包含的第一个元素),它不会抛出异常,就像 throw null 里面的内容一样。跨度>
    • @EyesightTechnology 是的。根据传达比菊花链更好的方式的答案。在这种情况下实际上不起作用。
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多