我正在使用MSXML2.DOMDocument在VBA中生成XML文档,然后将对象的XML属性发送到远程服务器(通过POST)。
MSXML2.DOMDocument.XML中的结果字符串没有换行符,因此它是XML的一大块。有没有办法让ouptput在每个XML元素后面添加一个新行,使文件更具人性化?
这并不是必不可少的,因为服务器上收到的文件将立即被解析并且信息存储在SQL数据库中,但这有助于开发和测试。
答案 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
这对我需要的东西很好,以为我会分享它。