XPath를 사용하여 사용자 정의 기본 네임스페이스에 대해 쿼리

이 문서에서는 XPath를 사용하여 사용자 정의 기본 네임스페이스를 쿼리하는 방법을 설명하고 동작을 재현하는 코드를 제공합니다.

원래 제품 버전: Visual Basic
원본 KB 번호: 288147

증상

XML 문서에서 기본 네임스페이스를 다시 정의할 때 기본 네임스페이스의 내부 SelectionNamespaces 속성을 변경한 다음 프로그래밍 방식으로 XPath를 사용하여 또는 selectSingleNodes 메서드를 사용하여 selectNodes 노드를 반환하려고 하면 노드가 반환되지 않습니다.

해결 방법

속성을 지정할 SelectionNamespaces 때 네임스페이스와 접두사를 사용하거나 XPath 대신 XSL(Extensible Stylesheet Language) 패턴 일치 작업을 사용합니다.

추가 정보

이것은 의도적으로 설계된 동작입니다.

DOMDocument에 대한 XPath 쿼리를 구현하려면 또는 selectSingleNode 메서드를 실행하기 전에 selectNodes DOM(문서 개체 모델)에서 네임스페이스를 선언해야 합니다.

동작을 재현하는 단계

  1. Visual Basic에서 새 표준 EXE 프로젝트를 만듭니다. Form1은 기본적으로 만들어집니다.

  2. Form1의 이벤트에 다음 코드를 붙여넣 Form_Unload() 습니다.

    ' You can change the ProgID to reflect the installed version of the Microsoft XML Parser:
    ' For example, with MSXML 6, you would use:
    ' Dim xmlDom As MSXML2.DOMDocument60
    Dim xmlDom As MSXML2.DOMDocument
    Dim nodeList As MSXML2.IXMLDOMNodeList
    Dim iNode As MSXML2.IXMLDOMNode
    
    ' For example, with MSXML 6, you would use:
    ' Set xmlDom = New MSXML2.DOMDocument60
    
    Set xmlDom = New MSXML2.DOMDocument
    
    With xmlDom
        .async = False
        .loadXML "<?xml version='1.0'?>" & _
        "<Root xmlns='uri:MyNameSpace'>" & _
        " <Test>This is a Test</Test>" & _
        "</Root>"
        .setProperty "SelectionLanguage", "XPath"
        .setProperty "SelectionNamespaces", "xmlns='uri:MyNameSpace'"
        Set nodeList = .selectNodes("//Test")
    End With
    
    For Each iNode In nodeList
        msgbox iNode.xml
    Next iNode
    
  3. 프로젝트 메뉴에서 참조를 클릭합니다. 사용 가능한 참조 목록에서 Microsoft XML, v3.0 이상을 선택합니다.

  4. 프로젝트를 실행합니다. XML이 반환되지 않습니다.

  5. setProperty 가지 메서드를 주석으로 처리합니다.

    참고

    또는 다음과 같이 두 줄의 코드를 수정할 수 있습니다.

    .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"
    Set nodeList = .selectNodes("//myNS:Test")
    
  6. 프로젝트를 실행합니다. XML 노드가 반환됩니다.

참조

XPath를 사용하여 DOM을 쿼리할 때 네임스페이스를 지정하는 방법