我使用VBScript将子节点添加到现有节点。但问题是输出是这样的
<parentNode>
<childNode/><addedChildNode/><anotherAddedChildNode/></parentNode>
我需要它们是这样的:
<parentNode>
<childNode/>
<addedChildNode/>
<anotherAddedChildNode/>
</parentNode>
我尝试在包含vbCr
,vbCrLf
,vbLf
或vbNewLine
之类的每一行之后添加文字节点
Set newLineNode= xmlDoc.createTextNode(vbCrLf)
parentNode.appendChild(newLineNode)
但无论如何,它给了我以下内容:
<parentNode>
<childNode/>
<addedChildNode/>
<anotherAddedChildNode/>
</parentNode>
您认为应该怎么做?顺便说一下,子节点的数量可能达到400左右。并且该文件可能被其他用户检查。所以格式很重要。
答案 0 :(得分:2)
如果您只是尝试格式化缩进和新行,请尝试使用此UD函数。
Option Explicit
Function FormatXML(sXML)
Dim sTmp ' Temp String
Dim sOut ' Output string
Dim lv ' level of indentation
Dim oTmp ' Temporary object
' Remove newline characters, tabs
sTmp = sXML
sTmp = Replace(sTmp, vbCrLf, "")
sTmp = Replace(sTmp, vbLf, "")
sTmp = Replace(sTmp, vbCr, "")
sTmp = Replace(sTmp, vbTab, "")
' Process contents split by the ending ">"
sOut = ""
lv = 0
For Each oTmp In Split(sTmp, ">")
oTmp = Trim(oTmp)
If Len(oTmp) > 0 Then
If Len(sOut) > 0 Then sOut = sOut & vbCrLf
If Left(oTmp, 2) = "</" Then
lv = lv - 1
sOut = sOut & String(lv, vbTab) & oTmp & ">"
Else
If Left(oTmp, 1) = "<" And Right(oTmp, 1) <> "/" Then
sOut = sOut & String(lv, vbTab) & oTmp & ">"
lv = lv + 1
Else
sOut = sOut & String(lv, vbTab) & oTmp & ">"
End If
End If
End If
Next
FormatXML = sOut
End Function
示例输入:
" <parentNode> " & vbCrLf & vbTab & "<childNode/> <addedChildNode/><addedChildNode><GrandchildNode>ABC<addedGrandChildNode/></GrandChildNode></addedChildNode><anotherAddedChildNode/></parentNode>"
答案 1 :(得分:1)
来自specs:
在编辑XML文档时,使用“白色空间”通常很方便 (空格,制表符和空行)将标记设置为更大 可读性。这种白色空间通常不打算包含在内 在交付的文档版本中。另一方面, “重要的”白色空间应该在交付时保留 版本很常见,例如在诗歌和源代码中。
正如我告诉你before,你需要告诉我们为什么你在文档中包含空格的内容。这是您刚刚发布的评论中所做的:
@Tomalak我已经知道了,但事情就是文件了 由其他用户检查。增加的孩子可能达到400 childred。所以用户几乎不可能阅读。
现在可以得到合理的答案:
答案 2 :(得分:1)
Google上的快速搜索显示,来自Robert McMurray的this blog post使用XSL转换来实现漂亮的XML打印:
xmlfile = "C:\path\to\your.xml"
Set xml = WScript.CreateObject("Msxml2.DOMDocument")
Set xsl = WScript.CreateObject("Msxml2.DOMDocument")
txt = Replace(fso.OpenTextFile(xmlfile).ReadAll, "><", ">" & vbCrLf & "<")
stylesheet = "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" & _
"<xsl:output method=""xml"" indent=""yes""/>" & _
"<xsl:template match=""/"">" & _
"<xsl:copy-of select="".""/>" & _
"</xsl:template>" & _
"</xsl:stylesheet>"
xsl.loadXML stylesheet
xml.loadXML txt
If xml.parseError Then
WScript.Echo xml.parseError.reason
WScript.Quit 1
End If
xml.transformNode xsl
xml.Save xmlFile
与here,here或here概述的SAXXMLReader
/ MXXMLWriter
方法相比,这种方法给我带来了更好的结果。
答案 3 :(得分:0)
感谢上述所有答案,但特别针对我的情况,我在每个节点之后写了相同的两行,并且只添加了vbTab
两次,它解决了我的问题。
Set newLineNode= xmlDoc.createTextNode(vbCrLf & vbTab & vbTab)
parentNode.appendChild(newLineNode)