【引用】xml实例

本文主要是拷贝“泪海航帆”的文章以便翻墙使用。

主要介绍解析xml

XMLPlatformUtils::Initialize(); 初始化平台,可以写在构造方法中 ,使用前必须初始化 

XMLPlatformUtils::Terminate();销毁平台 ,可以修在析构方法中。

复制代码
  //加载文件 filePath 为xml文件路径 (同样可以加载字符串形式的xml,参考中间部分读取cdata 内部 xml字段)
   XercesDOMParser *m_DOMXmlParser = new XercesDOMParser();
    m_DOMXmlParser->parse(filePath.GetBuffer(0));
    //得到文件对象
    DOMDocument *xmlDoc = m_DOMXmlParser->getDocument();
    //根节点为空
    if(!xmlDoc->getDocumentElement()) //getDocumentElement用来得到文件根节点
    {
        delete(m_DOMXmlParser);
        m_DOMXmlParser = NULL;
        return false;
    }
  //得到code 节点 当对应多个 code节点时 则是 nodelist 可用循环遍历,这里只有一个code 就去 item(0)的值    getElementsByTagName 方法很好
    DOMNode* xCode = xmlDoc->getElementsByTagName(XMLString::transcode("CODE"))->item(0);
  //取得属性的名称  TEXT
    char *bb = XMLString::transcode(xCode->getAttributes()->item(0)->getNodeName());
  //得到属性的值 (每个节点的第一个子节点都是它的值,即便这个值为空,当当前节点是TEXT_NODE属性时 ,才能得到getNodeValue的值这是取TEXT 属性的值,取结点的值 方法相同
    char* aa = XMLString::transcode(xCode->getAttributes()->item(0)->getFirstChild()->getNodeValue());
  //第二个 属性
    char *cc = XMLString::transcode(xCode->getAttributes()->item(1)->getNodeName());
    char* dd = XMLString::transcode(xCode->getAttributes()->item(1)->getFirstChild()->getNodeValue());

    //读取state节点值
    DOMNode *xState = xmlDoc->getElementsByTagName(XMLString::transcode("STATE"))->item(0);//同样只有一个节点,直接区0
  string str_name = XMLString::transcode(xState->getNodeName()); //可以用来取节点名称
 
 
    string str_state = XMLString::transcode(xState->getFirstChild()->getNodeValue());//XMLString::transcode 用于字符转换 XMLch转为  string 或者 char*
    //下面准备去cdata 部分的内容
    //找到data节点 cdata 看做是 data的子节点
    DOMNode* xData =  xmlDoc->getElementsByTagName(XMLString::transcode("DATA"))->item(0);
    DOMNodeList* nodeList =    xData->getChildNodes();//data节点的子节点 集合
    unsigned int len = nodeList->getLength();
  //遍历子节点的结合
    for (unsigned int i = 0;i<len;i++)
    {
        DOMNode *tmpNode = nodeList->item(i);//遍历节点
        if(tmpNode->getNodeType() == DOMNode:: CDATA_SECTION_NODE )  //cdata的类型CDATA_SECTION_NODE  其他的 节点 或者 内容都有自己的类型关键字 ,参照官网
        {
            DOMCDATASection *cdata = (DOMCDATASection*)tmpNode;
        //加入报文头,不然无法解析
            CString cdata_innerStr = "<?xml version=\"1.0\" encoding=\"GBK\"?>";  
            CString temp11.Format("%s",XMLString::transcode(cdata->getData()));//getData()得到cdata 内部字符窜
        cdata_innerStr += temp11;
 
 
          //通过类型转换 
       MemBufInputSource mem((const unsigned char*)cdata_innerStr.GetBuffer(cdata_innerStr.GetLength()),cdata_innerStr.GetLength(),(const XMLCh*)0);
          
      //mem 是字符窜,这里就是加载字符串型是的xml文件,下面的解析方法与上面相同了
            //加载cdata内部 xml文件
            XercesDOMParser *m_parser = new XercesDOMParser();
            m_parser->parse(mem);
            DOMDocument* cdoc = m_parser->getDocument();

            DOMNode* xKp = cdoc->getElementsByTagName(XMLString::transcode("KP"))->item(0);
            CString str_kp;
            str_kp.Format("%s",XMLString::transcode(xKp->getFirstChild()->getNodeValue()));
            if (str_kp != "1")
            {
                //读取 cdata中的msg节点
                DOMNode* xd_Msg = cdoc->getElementsByTagName(XMLString::transcode("MSG"))->item(0);
                msg.Format("%s",XMLString::transcode(xd_Msg->getFirstChild()->getNodeValue()));

                delete(m_DOMXmlParser);
                m_DOMXmlParser = NULL;
                return false;
            }
        }
    }
    delete(m_DOMXmlParser);
    m_DOMXmlParser = NULL;

复制代码
复制代码
<?xml version="1.0" encoding="GBK" ?>
<NS>
    <CODE TEST="456" VALUE="789">123</CODE> 
    <RSPTIME>abc</RSPTIME> 
    <STATE>1</STATE>
    <MSG>edg</MSG>
    <DATA>
    <![CDATA[
        <ROOT>
            <N NAME="mingcheng"  VALUE="TEST"/>
            <KP>0</KP>
            <MSG>wufakaipiaoyuanyin</MSG>
        </ROOT>
    ]]>
    </DATA>
</NS>
复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值