在VBA中输出MSXML2 XML文档的文本时如何获取新行?

时间:2011-03-14 23:43:05

标签: xml vba msxml

我正在使用MSXML2.DOMDocument在VBA中生成XML文档,然后将对象的XML属性发送到远程服务器(通过POST)。

MSXML2.DOMDocument.XML中的结果字符串没有换行符,因此它是XML的一大块。有没有办法让ouptput在每个XML元素后面添加一个新行,使文件更具人性化?

这并不是必不可少的,因为服务器上收到的文件将立即被解析并且信息存储在SQL数据库中,但这有助于开发和测试。

5 个答案:

答案 0 :(得分:1)

在将文件写入磁盘之前,您可以使用">"函数将">" & vbCrLf的每个实例替换为Replace

或者您可以将XML保存到磁盘,然后使用Firefox或IE打开它,它应该为您进行语法突出显示。

答案 1 :(得分:1)

不知道您是否找到了合适的解决方案/解决方法,但我在msxml中查看了这个问题,有人建议使用MXXMLWriter。您可以通过SAX解析器(SAXXMLReader)管道输出并将MXXMLWriter挂钩到它,如here所述。当您知道DOMDocument具有缩进所需的所有信息时,必须重新解析xml以使其格式化,这有点荒谬,但是你有它。

实际上我还没有时间去探索,但显然你可以使用未连接到SAX阅读器的MXXMLWriter来构建XML - 而不是使用DOMDocment - 而是让它在你去的时候缩进。请参阅说明here

答案 2 :(得分:1)

刚刚写了一个VBA sub,在保存之前缩进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

答案 3 :(得分:0)

也许你应该看看免费软件ChilKat Xml而不是可怕的MSXML,让你的生活变得轻松。我记得在使用MSXML进行缩进和格式化时很困难,我知道它是多么令人沮丧。

祝你好运。

答案 4 :(得分:0)

感谢Darth Jurassic提供的代码。非常方便!

在我自己的代码中,第二个“If”块在“xml.ParentNode”上被触发为Nothing。出于我自己的目的,我改变了以下行:

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

为:

If depth > 0 Then

这对我需要的东西很好,以为我会分享它。