2011-03-14 3 views
2

MSXML2.DOMDocument를 사용하여 VBA에서 XML 문서를 생성 한 다음 개체의 XML 속성을 POST를 통해 원격 서버에 보냅니다.VBA에서 MSXML2 XML 문서의 텍스트를 출력 할 때 새 줄을 어떻게 얻습니까?

MSXML2.DOMDocument.XML의 결과 문자열에는 줄 바꿈이 없으므로 XML의 큰 블롭입니다. 파일을 사람이 읽을 수있게 만드는 모든 XML 요소 다음에 새로운 행을 넣을 수있는 방법을 얻을 수 있습니까?

서버에서 수신 한 파일이 즉시 구문 분석되고 정보가 SQL 데이터베이스에 저장되기 때문에 이는 필수적인 것은 아니지만 개발 및 테스트에 도움이됩니다.

답변

1

디스크에 파일을 쓰기 전에 함수를 사용하여 의 모든 인스턴스를 ">" & vbCrLf으로 바꿀 수 있습니다.

또는 XML을 그대로 디스크에 저장하고 Firefox 또는 IE에서 구문 강조를 수행해야합니다.

0

아마도 MSXML 대신 프리웨어 ChilKat Xml을보고 쉽게 알아야합니다. MSXML을 사용하여 들여 쓰기 및 서식 지정에 어려움을 겪었던 점을 기억하고 있습니다.

행운을 빈다.

1

적합한 해결책/해결 방법을 찾았는지 모르겠지만 msxml에서이 문제를보고 있었고 누군가 MXXMLWriter를 사용하도록 제안했습니다. here과 같이 출력을 SAX 파서 (SAXXMLReader)를 통해 파이프하고 MXXMLWriter에 후크 할 수 있습니다. 들여 쓰기가 필요한 모든 정보가 DOMDocument에 있다는 것을 알았을 때 XML을 다시 구문 분석하여 형식화해야한다는 것은 다소 우스꽝 스럽지만 거기에는 가지고 있습니다.

실제로 아직 탐험 할 시간이 없었지만 DOMXML을 사용하지 않고 SAX 리더에 연결되지 않은 MXXMLWriter를 사용하여 DOMDocment 대신에 들여 쓰기를 할 수 있습니다. here의 지침을 참조하십시오.

+0

감사합니다. 다음 주에 시도해 보겠습니다. – HorusKol

1

XML 문서를 저장하기 전에 들여 쓰기하는 VBA 하위 문서를 작성했습니다. 들여 쓰기는 Visual Studio에서 포맷 할 때 나타나는 것과 비슷합니다. 어쩌면 하위 요소와 CDatas를 처리 할 수 ​​있도록 확장되어야합니다. 코드에 대한

Sub IndentXml(xml As IXMLDOMElement, Optional depth As Integer) 
    If IsMissing(depth) Then 
     depth = 0 
    End If 

    Dim txt As IXMLDOMText 

    If Not (xml.OwnerDocument.DocumentElement Is xml) Then 
     Set txt = xml.OwnerDocument.createTextNode(vbNewLine & String(depth, vbTab)) 
     xml.ParentNode.InsertBefore txt, xml 
    End If 

    Dim child As IXMLDOMNode 
    Dim hasElements As Boolean 
    hasElements = False 
    For Each child In xml.ChildNodes 
     If child.NodeType = NODE_ELEMENT Then 
      IndentXml child, depth + 1 
      hasElements = True 
     ElseIf child.NodeType = NODE_CDATA_SECTION Then 
      Set txt = xml.OwnerDocument.createTextNode(vbNewLine & String(depth + 1, vbTab)) 
      xml.InsertBefore txt, child 
      hasElements = True 
     End If 
    Next 

    If hasElements Then 
     Set txt = xml.OwnerDocument.createTextNode(vbNewLine & String(depth, vbTab)) 
     xml.appendChild txt 
    End If 
End Sub 
0

감사 다스 쥬라기. 매우 편리!

내 코드에서 두 번째 "If"블록이 "xml.ParentNode"에서 Nothing으로 트립되었습니다.

If Not (xml.OwnerDocument.DocumentElement Is xml) Then 

에 : 내 자신의 목적을 위해 난에서 다음 줄을 변경 내가 그래서 그것을 공유하고자 필요

If depth > 0 Then 

이것은 괜찮했다.

+0

내 문제의 이유는이 코드를 실행 한 시점에서 루트 노드를 DOM 문서에 추가하지 않았기 때문입니다. 그러나 그것은 여전히 ​​내가 만든 수정과 함께 작동합니다! –

관련 문제