我有一个XML文件,如下所示。。。
<a>
<b>
<version>1.0</version>
<c>
<Module>foo.EXE</Module>
</c>
<c>
<Module>bar.DLL</Module>
</c>
</b>
</a>
CComPtr<MSXML2::IXMLDOMNodeList> oRes = NULL ;
HRESULT hResult = m_StartNode->selectNodes(sQuery, &oRes) ;
当sQuery是
//a/b/c[Module[contains(.,'EXE')]]
,则hResult为E_FAIL,并且::GetLastError()返回0。
无可否认,我对XPATH还不熟悉,但为什么不返回所有包含“EXE”的Module元素的“c”元素呢。
其他简单的XPATH表达式也可以工作。
//a/b/c
下面是一个完整的控制台应用程序,演示了这个问题。
// XMLTest.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#import <msxml3.dll> raw_interfaces_only rename("value", "xmlvalue")
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
CComPtr<MSXML2::IXMLDOMDocument> thedoc;
thedoc.CoCreateInstance(__uuidof(MSXML2::DOMDocument));
_variant_t filename(L"c:\\shared\\test\\BlackListSmall.xml");
VARIANT_BOOL success;
HRESULT res = thedoc->load(filename, &success);
_bstr_t sQuery = L"//a/b/c[Module[contains(.,'EXE')]]";
CComPtr<MSXML2::IXMLDOMNodeList> oRes;
thedoc->selectNodes(sQuery, &oRes);
thedoc = NULL;
oRes = NULL;
CoUninitialize();
return 0;
}
这是stdafx.h的内容
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#ifndef STRICT
#define STRICT
#endif
#define _ATL_APARTMENT_THREADED
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
#include <atlbase.h>
#include <atlcom.h>
#include <atlctl.h>
using namespace ATL;
First-chance exception at 0x7564fbae in XMLTest.exe: 0xE0000001: 0xe0000001.
First-chance exception at 0x7564fbae in XMLTest.exe: 0xE0000001: 0xe0000001.
First-chance exception at 0x7564fbae in XMLTest.exe: 0xE0000001: 0xe0000001.
... 当我中断所有异常时,调用堆栈不提供真正的信息。
#import <msxml4.dll> raw_interfaces_only rename("value", "xmlvalue")
...
CComPtr<MSXML2::IXMLDOMDocument2> thedoc; //changed from IXMLDOMDocument
...
HRESULT res = thedoc->load(filename, &success); // unchanged
_bstr_t lang = L"SelectionLanguage"; // inserted
_variant_t xpathlang = L"XPath"; // inserted
thedoc->setProperty(lang,xpathlang); // inserted
_bstr_t sQuery = L"//a/b/c[Module[contains(.,'EXE')]]"; //unchanged
...
再次感谢迪米特