Что является заменой tinyxml2 (v2) для перечисления TiXmlNode v1?
TinyXML v1 может включать тип узла, но как сделать то же самое с XMLNode TinyXML v2.
switch (node->Type()) // v1 node type selector
{
case TiXmlNode::DOCUMENT:
wcout << L"Hello Document";
break;
Базовый класс 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) {
...
}
Других решений пока нет …