2011-03-14 29 views
2

我使用MSXML2.DOMDocument在VBA中生成一個XML文檔,然後將該對象的XML屬性發送到遠程服務器(通過POST)。如何在VBA中輸出MSXML2 XML文檔的文本時獲取新行?

MSXML2.DOMDocument.XML中的結果字符串沒有換行符,因此它是一個XML大塊。有沒有辦法讓ouptput在每個XML元素後添加一個新行,使得文件更具人性化?

這不完全是必要的,因爲服務器上收到的文件將被立即分析並將信息存儲在SQL數據庫中,但這有助於開發和測試。

回答

1

在將文件寫入磁盤之前,您可以使用Replace函數將">"的每個實例替換爲">" & vbCrLf

或者你可以將XML保存到磁盤上,並用Firefox或IE打開它,它應該爲你做語法突出顯示。

0

也許你應該看看免費軟件ChilKat Xml而不是可怕的MSXML,讓你的生活變得輕鬆。我記得使用MSXML縮進和格式化,我知道它有多令人沮喪。

祝你好運。

1

不知道您是否找到了合適的解決方案/解決方法,但我在msxml中查看此問題,並且有人提議使用MXXMLWriter。您可以通過SAX解析器(SAXXMLReader)管道輸出並將MXXMLWriter掛接到它,如here所述。當你知道DOMDocument具有它需要縮進的所有信息時,必須重新解析xml以使其格式化,這有點荒謬,但是你已經擁有了它。

其實我沒有時間去探索,但顯然你可以使用MXXMLWriter獨立於SAX閱讀器來構建XML - 而不是使用DOMDocment - 並且在你去的時候讓它縮進。請參閱說明here

+0

感謝 - 看起來很有希望......我將在下週試用 – HorusKol

1

剛剛寫了一個VBA子文件,在保存之前縮進XML文檔。縮進類似於我在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

感謝Darth Jurassic爲您的代碼。非常便利!

在我自己的代碼中,第二個「If」塊在「xml.ParentNode」中被絆倒爲Nothing。對於我自己而言,我改變了以下專線:

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

到:

If depth > 0 Then 

這工作得很好了什麼,我需要這樣想我會分享它。

+0

我的問題的原因是,我沒有在運行此代碼的位置將根節點追加到DOM文檔。但它仍然適用於我所做的修改! –

相關問題