wp_exmldoc.cpp

来自「电力故障信息采集,主要是针对南自的保护装置,这个程序用在Linux操作系统下」· C++ 代码 · 共 644 行 · 第 1/2 页

CPP
644
字号
        pTempNode = m_stackNode.top();        m_stackNode.pop();        if (NULL != pTempNode)        {            pTempNode->AddChild(pEXMLNode);            m_stackNode.push(pTempNode);        }        // else // error: when debugging    }    m_stackNode.push(pEXMLNode);    skip_unused_char(pszPre);    // 节点没有属性,不需要完整匹配性检查    if ('/'==*pszPre && '>'==*(pszPre+1))    {        // 函数成功返回时,指向XML字符串中节点结束标志'>'后一个字符        pszPre += 2;        m_stackNode.pop();        return true;    }    // 此节点处理结束,还没有完整性检查    if (*pszPre == '>')    {        // 函数成功返回时,指向XML字符串中节点结束标志'>'后一个字符。        pszPre++;        std::string strValue;        // 提取节点值        if (! PickNodeValue(pszPre, strValue))        {            EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickXMLNode(): FAIL, PickNodeValue(), Can't pick (name:%s)Node's value\n", strName.c_str() ));            return false;        }        pEXMLNode->SetValue(strValue.c_str());        return true;    }    // pszPre 指向XML字符串中节点名称后一个字符    if (! PickAttribute(pszPre)) // 提取节点属性    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickXMLNode(): FAIL, PickAttribute()\n" ));        return false;    }    std::string strValue;    // 提取节点值    if (! PickNodeValue(pszPre, strValue))    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickXMLNode(): FAIL, PickNodeValue()\n" ));        return false;    }    pEXMLNode->SetValue(strValue.c_str());    return true;}bool WP_EXMLDoc::PickNodeName(const char*& pszPre, std::string &strName){    skip_unused_char(pszPre);    // 名称不能以数字或"_" (下划线)开头    if ('\0'==*pszPre || isdigit(*pszPre) || '_'==*pszPre)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeName(): FAIL, PickNodeName(), Start character(%c) for XML'Node is not accepted: %s\n", *pszPre, pszPre ));        return false;    }    // 名称不能以字母 xml(或 XML 或 Xml ..)开头    if (_stricmp(pszPre, "xml") == 0)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeName(): FAIL, PickNodeName(), Start string(xml or XML or Xml etc.) for XML'Node is not accepted: %s\n", pszPre ));        return false;    }    do    {        // 名称中":"(冒号)、回车        if (':'==*pszPre)        {            EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeName(): FAIL, PickNodeName(), Character(:) in XML'Node is not accepted: %s\n", pszPre ));            return false;        }        // 不能包含空格、回车,函数成功返回时,pszPre 指向XML字符串中节点名称后一个字符。        if (isspace(*pszPre) || '>'==*pszPre)            break;        strName += *pszPre;    }while ('\0' != *(++pszPre));    if ('\0' == *(pszPre))    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeName(): FAIL, Arrived XML'data end\n" ));    }    return ('\0' != *(pszPre));}bool WP_EXMLDoc::PickNodeValue(const char*& pszPre, std::string &strValue){    skip_unused_char(pszPre);    if ('\0'!=*pszPre && '<'==*pszPre)    {        // EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeValue(): FAIL, Can't find the opened loop sign(<) for XMLNode' value: %s\n", pszPre ));        return true;    }    else if ('\0'==*pszPre)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeValue(): FAIL, Arrived XML'data end\n" ));        return false;    }    do    {        if ('<' == *pszPre)        {                        // 函数成功返回时,pszPre 指向XML字符串中节点名称后一个字符。            strValue += '\0';            //= 如果XML初始数据使用经过转义的单引号双引号,装载后再还原的XML数据            //= 中的单引号双引号没有经过转义            replace_all_distinct(strValue, "&apos;", "'");            replace_all_distinct(strValue, "&quot;", "\"");            replace_all_distinct(strValue, "&lt;", "<");            replace_all_distinct(strValue, "&gt;", ">");            replace_all_distinct(strValue, "&amp;", ">");            break;        }        else if ('>'==*pszPre)        {            EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeValue(): FAIL, Can't find the closed loop sign(>) for XMLNode' value: %s\n", pszPre ));            return false;        }        strValue += *pszPre;    }while ('\0' != *(++pszPre));    if ('\0' == *(pszPre))    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeValue(): FAIL, Arrived XML'data end\n" ));    }        return ('\0' != *(pszPre));}bool WP_EXMLDoc::PickAttribute(const char*& pszPre){    WP_EXMLNode *pNode;    std::string strAttName;    std::string strAttValue;    WP_EXMLAttribute *pAttr;    // 获取属性名    if (!PickAttributeName(pszPre, strAttName))    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, PickAttributeName()\n" ));        return false;    }    // 取得属性名后位于(=")后的属性值    if (!PickAttributeValue(pszPre, strAttValue))    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, PickAttributeValue()\n" ));        return false;    }    // 无节点的属性, 非法    if (0 == m_stackNode.size())    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, XMLAttribute(name:%s, value:%s not belong to any XMLNode, stack is empty\n", strAttName.c_str(), strAttValue.c_str() ));        return false;    }    pNode = m_stackNode.top();    pAttr = new WP_EXMLAttribute();    pAttr->SetName(strAttName.c_str());    pAttr->SetValue(strAttValue.c_str());    pNode->AddAttribute(pAttr);    skip_unused_char(pszPre);    if (*pszPre!='\0' && *(pszPre+1)!='\0' && *pszPre=='/'    && *(pszPre+1)=='>')    {        // 函数成功返回时,pszPre指向XML字符串中节点结束标志'>'后一个字符        pszPre += 2;        if (0 == m_stackNode.size())//无节点和节点结束符"/>"相匹配        {            EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttribute(): FAIL, Attribute(name:%s, value:%s) can't match XML's Node, stack is empty, \n", strAttName.c_str(), strAttValue.c_str() ));            return false;        }        m_stackNode.pop();        return true;    }    else if ('>' == *pszPre)    {        pszPre++;        return true;    }    else // 递归调用,pszPre指向上一次调用所获得节点属性值后可能为又一个节点属性名称前一个字符。    {        return PickAttribute(pszPre);    }}bool WP_EXMLDoc::PickAttributeName(const char*& pszPre, std::string &strName){    skip_unused_char(pszPre);    // 名称不能以数字或"_" (下划线)开头    if ('\0'==*pszPre || isdigit(*pszPre) || '_'==*pszPre)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, Start character(%c) for XMLAttribute's name is not accepted: %s\n", *pszPre, pszPre ));        return false;    }    // 名称不能以字母 xml(或 XML 或 Xml ..)开头    if (_stricmp(pszPre, "xml") == 0)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, Start string(xml or XML or Xml etc.) for XMLAttribute's name is not accepted: %s\n", pszPre ));        return false;    }    do    {        // 名称中":"(冒号)、回车        if (':'==*pszPre)        {            EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, Character(:) in XMLAttribute's name is not accepted: %s\n", pszPre ));            return false;        }        // 不能包含空格、回车,函数成功返回时,pszPre 指向XML字符串中节点名称后一个字符。        if (isspace(*pszPre) || '='==*pszPre || '\n'==*pszPre || '>'==*pszPre)            break;        strName += *pszPre;    }while ('\0' != *(++pszPre));    //没有属性名    if (strName.c_str() == NULL)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, XMLAttribute's name can't be empty\n", strName.c_str() ));        return false;    }    if ('\0' == *pszPre)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeName(): FAIL, Arrived XML'data end\n" ));    }    return ('\0' != *pszPre);}bool WP_EXMLDoc::PickAttributeValue(const char*& pszPre, std::string &strAttValue){    skip_unused_char(pszPre);    if ('=' != *pszPre++) // 无属性值    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeValue(): FAIL, Can't find the opened loop sign(=) for XMLAttribute's value: %s\n", pszPre ));        return false;    }    skip_unused_char(pszPre);    if ('\"' != *pszPre && '\'' != *pszPre) // 无属性值    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeValue(): FAIL, XMLAttribute's value can't be empty\n" ));        pszPre++;        return false;    }    // 属性值前缀:' 或 "    char prefix = *pszPre++;    do    {        if (prefix == *pszPre)        {            strAttValue += '\0';            //= 如果XML初始数据使用经过转义的单引号双引号,装载后再还原产生的            //= XML数据中的单引号双引号没有经过转义            replace_all_distinct(strAttValue, "&apos;", "'");            replace_all_distinct(strAttValue, "&quot;", "\"");            replace_all_distinct(strAttValue, "&lt;",     "<");            replace_all_distinct(strAttValue, "&gt;",     ">");            replace_all_distinct(strAttValue, "&amp;",    "&");            // 指向本次获取属性值的结束标志('或")后一字符            pszPre++;            break;        }        else if (    '<' != *pszPre                  && '>' != *pszPre)        {            strAttValue += *pszPre;        }        else // 属性值中含有非法字符        {            EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickAttributeValue(): FAIL, Unaccepted charactor(%c) is exist in XMLAttribute's value: %s\n", *pszPre, pszPre));            return false;        }    }while ('\0' != *(++pszPre));    if ('\0' == *pszPre)    {        EXML_LOG_MSG (( "EXML: WP_EXMLDoc::PickNodeValue(): FAIL, Arrived XML's data end\n" ));    }    return ('\0' != *pszPre);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?