【问题标题】:tinyxml2 Equivalent of TiXmlNode Enumeration?tinyxml2 等效于 TiXmlNode 枚举?
【发布时间】:2014-01-17 20:58:34
【问题描述】:

v1 的 TiXmlNode 枚举的 tinyxml2 (v2) 替代品是什么?
TinyXML v1 可以开启节点类型,但是如何用 TinyXML v2 的 XMLNode 做同样的事情。

switch (node->Type()) // v1 node type selector
{
    case TiXmlNode::DOCUMENT:
        wcout << L"Hello Document";
    break;

【问题讨论】:

    标签: c++ xml-parsing tinyxml tinyxml2


    【解决方案1】:

    基类XMLNode 包含许多虚拟转换方法,它们返回NULL0,除非节点实际上是指定的类型。

    例如,如果您在实际上是 XMLText 的东西上调用 ToText(),您将获得有效的 XMLText* 结果,否则您将获得 NULL

    这里是可用的方法(XMLNode):

    /// Safely cast to an Element, or null.
    virtual XMLElement* ToElement() {
        return 0;
    }
    /// Safely cast to Text, or null.
    virtual XMLText* ToText() {
        return 0;
    }
    /// Safely cast to a Comment, or null.
    virtual XMLComment* ToComment() {
        return 0;
    }
    /// Safely cast to a Document, or null.
    virtual XMLDocument* ToDocument() {
        return 0;
    }
    /// Safely cast to a Declaration, or null.
    virtual XMLDeclaration* ToDeclaration() {
        return 0;
    }
    /// Safely cast to an Unknown, or null.
    virtual XMLUnknown* ToUnknown() {
        return 0;
    }
    

    我不知道为什么这样做;也许类型枚举在实践中没有那么有用,或者它可能是为了支持内部 XMLHandle 类(它实现了所有这些强制转换方法)。要转换您的代码,您可以从这里开始:

    switch (node->Type()) {
        case TiXMLNode::DOCUMENT:
            ...
            break;
        case TiXMLNode::TEXT:
            ...
            break;
        ...
    }
    

    进入这个:

    XMLDocument *doc = node->ToDocument();
    if (doc) {
        ...
    }
    XMLText *text = node->ToText();
    if (text) {
        ...
    }
    

    【讨论】:

    • 对枚举使用 switch() 语句要优雅得多。我希望缺少的枚举不是因为作者试图简约。如果是这样,那就走得太远了。你的回答让我畅通无阻。谢谢你。如果没有更优雅的出现,我会勾选你的答案。
    • @BSalita 我怀疑一个动机是在查询节点类型时,人们无论如何都会进行转换,因此新方法将节省一两行代码。不过,您需要向作者询问真正的原因。
    • tinyXml (v2) 有太多问题,所以我切换到 pugiXml。 pugiXml 运行良好。
    • 我同意枚举更优雅(并且在升级到 tinyxml2 时感到困惑),但就个人而言,我从来不需要这样的 switch 语句,即我很清楚什么是我当时需要的元素类型(我猜这更像是 SAX 风格),这样我可以保存一个操作(类型枚举检查),然后继续使用 To[Type]() 的结果,如果任何。
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2013-11-30
    • 2014-10-17
    • 1970-01-01
    • 2017-11-27
    • 2010-10-09
    • 2021-01-24
    相关资源
    最近更新 更多