代码之家  ›  专栏  ›  技术社区  ›  Les

XPATH包含(字符串,字符串)不工作

  •  1
  • Les  · 技术社区  · 15 年前

    我有一个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
    ...
    

    再次感谢迪米特

    2 回复  |  直到 15 年前
        1
  •  1
  •   Dimitre Novatchev    15 年前

    :

    setProperty("SelectionLanguage", "XPath");
    

    SelectNodes() 使用XPath表达式的methd。

    默认值不是XPath,而是一些早期的选择语言。

        2
  •  0
  •   Jonathan Fingland    15 年前

    你想要:

    "//a/b/c[contains(./Module/text(),'EXE')]"