0

再会。问题如下。我有一个有效的 *.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 编译。

PS 相同的代码显然在 Windows 上运行良好。

更新:将 dynamic_cast 更改为 static_cast 使代码运行没有错误。然而,它留下了一些悬而未决的问题。

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

2)在这种情况下是否有更好/更清洁的投射方式?

4

2 回答 2

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
于 2015-08-21T12:07:33.650 回答
0

好的,原因如下:默认情况下,Xerces 库不是在启用 RTTI 的情况下构建的。为了使 OP 中的机制正常工作,应该在启用 RTTI 的情况下重建库。https://issues.apache.org/jira/browse/XERCESC-819

于 2015-08-21T13:22:12.017 回答