Xerces XML解析器,将XMLCh*转换为float

Xerces XML parser, converting XMLCh* to float

本文关键字:XMLCh 转换 float XML Xerces      更新时间:2023-10-16

我试图通过套接字读取一个XML字符串,并使用Xerces解析器对其进行解析,但其中一些值出现了问题。这很奇怪,因为我所做的在代码的其他地方也起作用,但当我试图在另一个地方重用逻辑时,它就不起作用了。以下是我基本上所做的:

void Parser::ParseAB(DOMNode* node)
{
    const XMLCh* aNode = XMLString::transcode("a");
    const XMLCh* bNode = XMLString::transcode("b");
    DOMNode* child = node->getFirstChild();
    XMLCh *val, *childName;
    char* charValue;
    double aVal, bVal;
    while(child)
    {
        childName = (XMLCh*)child->getNodeName();
        val = (XMLCh*)child->getTextContent();
        charValue = (char*)val;
        if(XMLString::equals(childName, aNode))
        {
            aVal = atof((const char*)val);
        }else if(XMLString::equals(childName, bNode))
        {
            bValue = atof((const char*)val);
        }else std::cout<<"Unrecognized optionn";
        child = child->getNextSibling();
    }
    m_pInfo->setAB(aVal, bVal);
}

我一直在NetBeans 8.0.1中调试代码,当我将鼠标悬停在"val"上以在其存储在aVal中之前检查其内容时,我会看到0x600416920 L"33.456030344"。这对我来说很好,因为33.456030342是我试图存储的正确值。但是,对atof()的调用会产生值3,这显然是不正确的。如果我将XMLCh*转换为char*并打印char*值,我也会得到3。类似地,bVal的值应该是-31.32234,但对atof的调用返回的值为零。当我将这个XMLCh*转换为char*并打印char*时,只打印负号。在我看来,只有第一个字符被转换为浮点或类似的东西。同样的逻辑在我的代码中的许多地方都起了作用,我不明白为什么它在这里不起作用。有没有其他方法可以将XMLCh*val转换为具有正确值的浮点数字?

如注释中所述,问题在于XMLCh和char不是同一类型。更确切地说,XMLCh是char16_t,如下所示。

#define XERCES_XMLCH_T char16_t
typedef XERCES_XMLCH_T XMLCh;

这是普通字符的两倍大,这就是为什么当作为char*读取时字符串会出错的原因。它将每个XMLCh分成2个字符。

将XMLCh*转换为char*的正确方法是:

char* charValue = XMLString::transcode(val);

然后,char*可以用于char*通常用于的任何用途。

还要记住释放用于char*的数据,因为XMLString::对分配的数据进行代码转换。像这样释放数据:

XMLString::release(&charValue);