Xerces.动态转换DOMNode指针到DOMElement返回一个nullptr

Xerces. Dynamic casting DOMNode pointer to DOMElement returns a nullptr

本文关键字:nullptr 一个 返回 DOMElement 转换 动态 DOMNode 指针 Xerces      更新时间:2023-10-16

大家好。问题是这样的。我有一个有效的*.xml文件,我尝试使用以下代码解析:

for(XMLSize_t i = 0; i < childrenNodeCount; ++i)
{
  DOMNode* currentNode = children->item(i);
  if ((currentNode->getNodeType() != 0) && (currentNode->getNodeType() == DOMNode::ELEMENT_NODE))
  {
    DOMElement* currentElement = dynamic_cast<xercesc::DOMElement*>(currentNode); // !!!
    if (XMLString::equals(currentElement->getTagName(), TAG_SectionHeader))
    {
      // parse this part
    }
    if (XMLString::equals(currentElement->getTagName(), TAG_SectionBody))
    {
      // parse this part
    }
  }
}

程序在执行过程中崩溃,并在第一次"等于"检查时显示SIGILL。调试表明,在动态强制转换之后,currentElement实际上是一个空指针。这里的问题是什么?

使用xlc++, Xerces库2.5,AIX 7编译。

注:同样的代码显然在Windows上运行良好。

UPDATE:将dynamic_cast更改为static_cast可以使代码正常运行。然而,它留下了一些未解之谜。

1)为什么在Windows上使用dynamic_cast而在Unix上不使用时代码运行没有错误?可能是编译器或库版本问题?

2)在这种情况下是否有更好/更干净的方法来强制转换?

您没有提到编译器版本或选项,您是否指定了-qrtti来启用dynamic_cast?

    -qrtti=<option> | -qnortti
            (C++) Generates runtime type identification (RTTI)
            information for the typeid and dynamic_cast
            operators.  The suboptions are:
            all
                 Generates the information needed for the RTTI
                 typeid and dynamic_cast operators.
            type | typeinfo
                 Generates the information needed for the RTTI
                 typeid operator only.
            dyna | dynamiccast
                 Generates the information needed for the RTTI
                 dynamic_cast operator only.
            Default: -qnortti

好,原因如下:Xerces库在默认情况下没有启用RTTI。为了使OP中的机制发挥作用,应该在启用RTTI的情况下重建库。https://issues.apache.org/jira/browse/xercesc - 819