// 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");
结果如图: