tinyxml2 Эквивалент перечисления TiXmlNode?

Что является заменой tinyxml2 (v2) для перечисления TiXmlNode v1?
TinyXML v1 может включать тип узла, но как это сделать с XMLNode TinyXML v2.

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

1 ответ

Решение

Базовый класс XMLNode содержит несколько виртуальных методов преобразования, которые возвращают NULL или же 0 если узел на самом деле не указанного типа.

Например, если вы звоните ToText() на то, что на самом деле XMLText, вы получите действительный 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) {
    ...
}
Другие вопросы по тегам