DOM 대신 SAX를 사용해 볼 수 있습니다. SAX는 문서를 파싱하고 문서의 크기가 작을 때 더 빠를 것입니다. MSXML에서의 SAX2 구현에 대한 참조는 here
입니다. 일반적으로 Excel에서 대부분의 XML 구문 분석을 위해 DOM에 곧바로 접근하지만 SAX는 일부 상황에서 이점이있는 것으로 보입니다. 짧은 비교 here은 그 차이점을 설명하는 데 도움이 될 수 있습니다.
여기에 바로 출력 Debug.Print
를 사용하여 (부분적으로 this 기준) 해킹 - 함께 예입니다 :
가 기준이 "마이크로 소프트 XML, V6를 추가합니다.도구> 참조를 통해 0 "
, 클래스 모듈을 추가 정상적인 모듈
Option Explicit
Sub main()
Dim saxReader As SAXXMLReader60
Dim saxhandler As ContentHandlerImpl
Set saxReader = New SAXXMLReader60
Set saxhandler = New ContentHandlerImpl
Set saxReader.contentHandler = saxhandler
saxReader.parseURL "file://C:\Users\foo\Desktop\bar.xml"
Set saxReader = Nothing
End Sub
이 코드를 추가 ContentHandlerImpl
를 호출하고 다음 코드
Option Explicit
Implements IVBSAXContentHandler
Private lCounter As Long
Private sNodeValues As String
Private bGetChars As Boolean
사용 왼쪽 드롭을 추가 - 모듈 상단에서 "IVBSAXContentHandler"를 선택한 다음 오른쪽 드롭 다운을 사용하여 각 이벤트의 스텁을 차례로 추가하십시오 (characters
에서 startPrefixMapping
까지)
우리는이 시간
Private Sub IVBSAXContentHandler_startDocument()
lCounter = 0
bGetChars = False
End Sub
새로운 요소가 시작될 때마다에서 텍스트 데이터를 읽으려면
가 명시 적으로 표시하기 위해 카운터와 플래그를 설정 체크를 다음과 같이 10
은 명세서의 일부 코드를 추가합니다 요소의 이름 및 취할 적절한 조치
Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes)
Select Case strLocalName
Case "Row"
sNodeValues = ""
Case "Col"
sNodeValues = sNodeValues & "|" & oAttributes.getValueFromName(strNamespaceURI, "id") & ":"
bGetChars = True
Case Else
' do nothing
End Select
End Sub
확인이 수도 또는하지 않을 수 있습니다 (우리는 텍스트 데이터에 관심이 있는지 확인하고, 우리가있는 경우, 불필요한 공백을 잘라 모든 줄 바꿈 제거하는 문서에 따라 바람직하다. 우리가 다음 텍스트 값을 읽는 중지하고 Col
의 끝에 도달 한 경우)
Private Sub IVBSAXContentHandler_characters(strChars As String)
If (bGetChars) Then
sNodeValues = sNodeValues & Replace(Trim$(strChars), vbLf, "")
End If
End Sub
을 구문 분석하려고; 우리가 의 끝에 도달 한 경우 노드의 문자열이 일을 명확하게하기 위해
Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, strLocalName As String, strQName As String)
Select Case strLocalName
Case "Col"
bGetChars = False
Case "Row"
lCounter = lCounter + 1
Debug.Print lCounter & " " & sNodeValues
Case Else
' do nothing
End Select
End Sub
값에서 여기에 장소에 스텁 방법의 알과 ContentHandlerImpl
의 전체 버전은 인쇄 :
Option Explicit
Implements IVBSAXContentHandler
Private lCounter As Long
Private sNodeValues As String
Private bGetChars As Boolean
Private Sub IVBSAXContentHandler_characters(strChars As String)
If (bGetChars) Then
sNodeValues = sNodeValues & Replace(Trim$(strChars), vbLf, "")
End If
End Sub
Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS As MSXML2.IVBSAXLocator)
End Property
Private Sub IVBSAXContentHandler_endDocument()
End Sub
Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, strLocalName As String, strQName As String)
Select Case strLocalName
Case "Col"
bGetChars = False
Case "Row"
lCounter = lCounter + 1
Debug.Print lCounter & " " & sNodeValues
Case Else
' do nothing
End Select
End Sub
Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix As String)
End Sub
Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars As String)
End Sub
Private Sub IVBSAXContentHandler_processingInstruction(strTarget As String, strData As String)
End Sub
Private Sub IVBSAXContentHandler_skippedEntity(strName As String)
End Sub
Private Sub IVBSAXContentHandler_startDocument()
lCounter = 0
bGetChars = False
End Sub
Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes)
Select Case strLocalName
Case "Row"
sNodeValues = ""
Case "Col"
sNodeValues = sNodeValues & "|" & oAttributes.getValueFromName(strNamespaceURI, "id") & ":"
bGetChars = True
Case Else
' do nothing
End Select
End Sub
Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix As String, strURI As String)
End Sub
달성하려는 목표는 무엇입니까? 모든 행과 열을 반복 할 필요가 있거나 실제로 필요한 데이터의 하위 집합이 있습니까? SQL을 사용하여 데이터베이스에서 레코드 세트로 "선택 *"하고 테이블의 모든 행과 열을 반복하는 경우 처리 속도가 매우 느릴 수 있지만 일반적으로 데이터베이스의 데이터를 효율적으로 처리하는 방법은 아닙니다. 마찬가지로 XPath를 사용하여 전체 문서를 반복하지 않고 처리해야하는 XML의 하위 집합을 선택할 수 있습니다. –