2012-01-18 4 views
2

VBA를 사용하여 MSXML2 및 XPath로 비누 xml을 구문 분석하지만 selectNodes 메서드에서 XPath 쿼리가 다양한 도구에서 작동하는 동안 아무 것도 선택하지 않습니다. 지금까지 본 많은 질문에서 수집 한 것부터 네임 스페이스를 지정하는 대신이 'local-name'구문을 사용할 수 있지만 아무것도 선택하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?XPath가 MSXML2와 함께 실패 함

private const DQ = """" 
Public Sub parseXML(sFileName As String) 
Dim xmldoc As New MSXML2.DOMDocument60, I As IXMLDOMNodeList, x As IXMLDOMNode 

With xmldoc 
    .loadXML sFileName 
    .SetProperty "SelectionLanguage", "XPath" 
    Set I = .selectNodes("//*[local-name()=" & DQ & "item" & DQ & "]") 
    If I.length > 0 Then 
    ' do something useful 
    end if 
End With 
End Sub 


<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap-env:Header></soap-env:Header> 
<soap-env:Body> 
    <n0:ZBexQaasResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style"> 
    <Messages> 
    <item> 
     // some elements 
    </item> 
    </Messages> 
    <OutputTable> 
    <item> 
    // some elements 
    </item> 
    </OutputTable> 
    <TextElements></TextElements> 
    <XmlOutput></XmlOutput> 
    <XmlTxtelem></XmlTxtelem> 
    </n0:ZBexQaasResponse> 
</soap-env:Body> 
</soap-env:Envelope> 
+0

'loadXML' 호출 후에'.parseError.errorCode'와'.parseError.reason'을 확인하십시오. 그리고'loadXML sFileName'은 틀린 것처럼 보입니다.'loadXML' 메쏘드는 파일 이름이 아닌 XML 문서 마크 업과 함께 문자열을 기대합니다. 파일 이름을 가지고 있다면'load' 메쏘드를 사용하십시오 ('.async = False' 설정 후에). –

+0

sFilename = 텍스트 파일로 비누 데이터. '.pareseError.ErrorCode'와'.parseError.reason'은 각각'-1072896682'와'문서의 최상위 레벨에서 무효 '를 반환했습니다. 대신에'.load '메쏘드를 사용하면 오류는 없지만 노드는 찾을 수 없습니다. – Todd

답변

1

코드 (대신 loadXMLload하고 필요한 async 설정으로는, 이미 코멘트에서 제안) 이유가 표시되지 않습니다 작동하지해야하며, 나는이 때이 문제를 재현 할 수 없습니다

Dim doc, items 
Set doc = CreateObject("Msxml2.DOMDocument.6.0") 
doc.async = False 
If doc.load("test2012011901.xml") Then 
    Set items = doc.selectNodes("//item") 
    WScript.Echo "Found " & items.length & " element(s)." 
    For Each item In items 
    WScript.Echo item.xml 
    Next 
    Set items = doc.selectNodes("//*[local-name() = 'item']") 
    WScript.Echo "Found " & items.length & " element(s)." 
    For Each item In items 
    WScript.Echo item.xml 
    Next 
Else 
    WScript.Echo "Parse error " & doc.parseError.reason 
End If 

다음 두 XPath 식을 두을 찾을

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap-env:Header></soap-env:Header> 
<soap-env:Body> 
    <n0:ZBexQaasResponse xmlns:n0="urn:sap-com:document:sap:soap:functions:mc-style"> 
    <Messages> 
    <item> 
     // some elements 
    </item> 
    </Messages> 
    <OutputTable> 
    <item> 
    // some elements 
    </item> 
    </OutputTable> 
    <TextElements></TextElements> 
    <XmlOutput></XmlOutput> 
    <XmlTxtelem></XmlTxtelem> 
    </n0:ZBexQaasResponse> 
</soap-env:Body> 
</soap-env:Envelope> 

및 VBScript 코드로 test2012011901.xml 파일 출력 쇼 등 21,요소 : 나는 당신의 문제를 해결해야 주석에 내 의견을 말할 수있는

Found 2 element(s). 
<item> 
     // some elements 
    </item> 
<item> 
    // some elements 
    </item> 
Found 2 element(s). 
<item> 
     // some elements 
    </item> 
<item> 
    // some elements 
    </item> 

지금까지, 당신은 여전히 ​​문제가있을 경우 정교해야합니다.

+0

'load' 메소드로 바꾸는 것은 정말로 효과가있었습니다. 어제도 알지 못했는데,'item.xml' 대신에'item.nodevalue'를 보려고했기 때문입니다. 명확히 해 주셔서 감사합니다. – Todd

관련 문제