zoukankan      html  css  js  c++  java
  • MSXML读取XML中文

    // QueryNodes.cpp : Defines the entry point for the console application.
    //
    
    #include <stdio.h>
    #include <tchar.h>
    #include <msxml6.h>
    
    // Macro that calls a COM method returning HRESULT value.
    #define CHK_HR(stmt)        do { hr=(stmt); if (FAILED(hr)) goto CleanUp; } while(0)
    
    // Macro to verify memory allcation.
    #define CHK_ALLOC(p)        do { if (!(p)) { hr = E_OUTOFMEMORY; goto CleanUp; } } while(0)
    
    // Macro that releases a COM object if not NULL.
    #define SAFE_RELEASE(p)     do { if ((p)) { (p)->Release(); (p) = NULL; } } while(0)
    
    // Helper function to create a VT_BSTR variant from a null terminated string. 
    HRESULT VariantFromString(PCWSTR wszValue, VARIANT &Variant)
    {
        HRESULT hr = S_OK;
        BSTR bstr = SysAllocString(wszValue);
        CHK_ALLOC(bstr);
    
        V_VT(&Variant)   = VT_BSTR;
        V_BSTR(&Variant) = bstr;
    
    CleanUp:
        return hr;
    }
    
    // Helper function to create a DOM instance. 
    HRESULT CreateAndInitDOM(IXMLDOMDocument **ppDoc)
    {
        HRESULT hr = CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppDoc));
        if (SUCCEEDED(hr))
        {
            // these methods should not fail so don't inspect result
            (*ppDoc)->put_async(VARIANT_FALSE);  
            (*ppDoc)->put_validateOnParse(VARIANT_FALSE);
            (*ppDoc)->put_resolveExternals(VARIANT_FALSE);
            (*ppDoc)->put_preserveWhiteSpace(VARIANT_TRUE);
        }
        return hr;
    }
    
    // Helper function to display parse error.
    // It returns error code of the parse error.
    HRESULT ReportParseError(IXMLDOMDocument *pDoc, char *szDesc)
    {
        HRESULT hr = S_OK;
        HRESULT hrRet = E_FAIL; // Default error code if failed to get from parse error.
        IXMLDOMParseError *pXMLErr = NULL;
        BSTR bstrReason = NULL;
    
        CHK_HR(pDoc->get_parseError(&pXMLErr));
        CHK_HR(pXMLErr->get_errorCode(&hrRet));
        CHK_HR(pXMLErr->get_reason(&bstrReason));
        printf("%s
    %S
    ", szDesc, bstrReason);
    
    CleanUp:
        SAFE_RELEASE(pXMLErr);
        SysFreeString(bstrReason);
        return hrRet;
    }
    
    void queryNodes()
    {
        HRESULT hr = S_OK;
        IXMLDOMDocument *pXMLDom = NULL;
        IXMLDOMNodeList *pNodes = NULL;
        IXMLDOMNode *pNode = NULL;
    
        BSTR bstrQuery1 = NULL;
        BSTR bstrQuery2 = NULL;
        BSTR bstrNodeName = NULL;
        BSTR bstrNodeValue = NULL;
        VARIANT_BOOL varStatus;
        VARIANT varFileName;
        VariantInit(&varFileName);
    
        WCHAR *ptext = L"<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
                      <result>
                      
                      <interpretation confidence="43" grammar="1">
                      <instance>南京到合肥nanjingdaohefei</instance>
                      <input mode="speech">我买从南京到合肥的票</input>
                      </interpretation>
                      
                      </result>";
    
        CHK_HR(CreateAndInitDOM(&pXMLDom));
    
        //CHK_HR(VariantFromString(L"stocks.xml", varFileName));
        //CHK_HR(pXMLDom->load(varFileName, &varStatus));
        CHK_HR(pXMLDom->loadXML(ptext,&varStatus));
        if (varStatus != VARIANT_TRUE)
        {
            CHK_HR(ReportParseError(pXMLDom, "Failed to load DOM from stocks.xml."));
        }
    
        // Query a single node.
        bstrQuery1 = SysAllocString(L"//instance");////stock[1]/*
        CHK_ALLOC(bstrQuery1);
        CHK_HR(pXMLDom->selectSingleNode(bstrQuery1, &pNode));
        if (pNode)
        {
            printf("Result from selectSingleNode:
    ");
            CHK_HR(pNode->get_nodeName(&bstrNodeName));
            printf("Node, <%S>:
    ", bstrNodeName);
            SysFreeString(bstrNodeName);
    
            CHK_HR(pNode->get_xml(&bstrNodeValue));
            printf("	%S
    
    ", bstrNodeValue);
            SysFreeString(bstrNodeValue);
    
            //VARIANT bstrNodeText;
            BSTR bstrNodeText;
            pNode->get_text(&bstrNodeText);
            printf("	%S
    
    ", bstrNodeText);//bstrNodeText.bstrVal
    
                     
            SAFE_RELEASE(pNode);
        }
        else
        {
            CHK_HR(ReportParseError(pXMLDom, "Error while calling selectSingleNode."));
        }
    
        // Query a node-set.
        bstrQuery2 = SysAllocString(L"//stock/*");
        CHK_ALLOC(bstrQuery2);
        CHK_HR(pXMLDom->selectNodes(bstrQuery2, &pNodes));
        if(pNodes)
        {
            printf("Results from selectNodes:
    ");
            //get the length of node-set
            long length;
            CHK_HR(pNodes->get_length(&length));
            for (long i = 0; i < length; i++)
            {
                CHK_HR(pNodes->get_item(i, &pNode));
                CHK_HR(pNode->get_nodeName(&bstrNodeName));
                printf("Node (%d), <%S>:
    ", i, bstrNodeName);
                SysFreeString(bstrNodeName);
    
                CHK_HR(pNode->get_xml(&bstrNodeValue));
                printf("	%S
    ", bstrNodeValue);
                SysFreeString(bstrNodeValue);
                SAFE_RELEASE(pNode);
            }
        }
        else
        {
            CHK_HR(ReportParseError(pXMLDom, "Error while calling selectNodes."));
        }
    
    CleanUp:
        SAFE_RELEASE(pXMLDom);
        SAFE_RELEASE(pNodes);
        SAFE_RELEASE(pNode);
        SysFreeString(bstrQuery1);
        SysFreeString(bstrQuery2);
        SysFreeString(bstrNodeName);
        SysFreeString(bstrNodeValue);
        VariantClear(&varFileName);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        setlocale(LC_ALL,"chinese-simplified");
    
        HRESULT hr = CoInitialize(NULL);
        if (SUCCEEDED(hr))
        {
            queryNodes();
            CoUninitialize();
        }
    
        system("pause");
    
        return 0;
    
    }

    其中关键一步设置(区域,头文件#include <locale>)

    setlocale(LC_ALL,"chinese-simplified");

    结果如图:

  • 相关阅读:
    Base64
    HBase搭建
    解决Zookeeper无法启动的问题
    docker基础知识之挂载本地目录
    VMware升级到15版本虚拟机黑屏的解决方法
    docker端口映射或启动容器时报错Error response from daemon: driver failed programming external connectivity on endpoint
    MQTT 入门介绍
    OpeTSDB的Configuration配置
    js中ES6的Set的基本用法
    Review-JVM
  • 原文地址:https://www.cnblogs.com/ydxt/p/3509297.html
Copyright © 2011-2022 走看看