Xerces。将 DOMNode 指针动态转换为 DOMElement returns nullptr
Xerces. Dynamic casting DOMNode pointer to DOMElement returns a nullptr
美好的一天。问题如下。我有一个有效的 *.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
}
}
}
程序在执行期间崩溃,第一次 "equals" 检查时出现 SIGILL。调试显示,动态转换后,currentElement 实际上是一个空指针。这可能是什么问题?
使用 xlc++、Xerces 库 2.5、AIX 7 进行编译。
P.S。显然,相同的代码在 Windows 上运行良好。
更新:将 dynamic_cast 更改为 static_cast 使代码 运行 没有错误。然而,它留下了一些悬而未决的问题。
1) 为什么代码 运行 在 Windows 上使用 dynamic_cast 而在 Unix 上却没有错误?会不会是编译器或库版本问题?
2) 在这种情况下有 better/cleaner 的投射方式吗?
您没有提到编译器版本或选项,您是否指定了 -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
美好的一天。问题如下。我有一个有效的 *.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
}
}
}
程序在执行期间崩溃,第一次 "equals" 检查时出现 SIGILL。调试显示,动态转换后,currentElement 实际上是一个空指针。这可能是什么问题?
使用 xlc++、Xerces 库 2.5、AIX 7 进行编译。
P.S。显然,相同的代码在 Windows 上运行良好。
更新:将 dynamic_cast 更改为 static_cast 使代码 运行 没有错误。然而,它留下了一些悬而未决的问题。
1) 为什么代码 运行 在 Windows 上使用 dynamic_cast 而在 Unix 上却没有错误?会不会是编译器或库版本问题?
2) 在这种情况下有 better/cleaner 的投射方式吗?
您没有提到编译器版本或选项,您是否指定了 -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