如何在XML文件中添加换行符?

时间:2015-07-30 17:09:51

标签: dom vbscript xml

我使用VBScript将子节点添加到现有节点。但问题是输出是这样的

<parentNode>
    <childNode/><addedChildNode/><anotherAddedChildNode/></parentNode>

我需要它们是这样的:

<parentNode>
    <childNode/>
    <addedChildNode/>
    <anotherAddedChildNode/>
</parentNode>

我尝试在包含vbCrvbCrLfvbLfvbNewLine之类的每一行之后添加文字节点

Set newLineNode= xmlDoc.createTextNode(vbCrLf)
parentNode.appendChild(newLineNode)  

但无论如何,它给了我以下内容:

    <parentNode>
        <childNode/>
<addedChildNode/>
<anotherAddedChildNode/>
</parentNode>

您认为应该怎么做?顺便说一下,子节点的数量可能达到400左右。并且该文件可能被其他用户检查。所以格式很重要。

4 个答案:

答案 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>"

样品输出:
sample output

答案 1 :(得分:1)

来自specs

  

在编辑XML文档时,使用“白色空间”通常很方便   (空格,制表符和空行)将标记设置为更大   可读性。这种白色空间通常不打算包含在内   在交付的文档版本中。另一方面,   “重要的”白色空间应该在交付时保留   版本很常见,例如在诗歌和源代码中。

正如我告诉你before,你需要告诉我们为什么你在文档中包含空格的内容。这是您刚刚发布的评论中所做的:

  

@Tomalak我已经知道了,但事情就是文件了   由其他用户检查。增加的孩子可能达到400   childred。所以用户几乎不可能阅读。

现在可以得到合理的答案:

  1. 根本不打扰漂亮的白色空间。查看XML文档的体面工具将忽略此类空格并正确显示文档的结构
  2. 使用工具(例如整洁)或编写脚本/程序来漂亮打印文档;然后可以在愚蠢的文本编辑器中查看。
  3. 不要将包含空格的元素/节点插入树中。这将改变文件的结构(从而改变其含义)。

答案 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

hereherehere概述的SAXXMLReader / MXXMLWriter方法相比,这种方法给我带来了更好的结果。

答案 3 :(得分:0)

感谢上述所有答案,但特别针对我的情况,我在每个节点之后写了相同的两行,并且只添加了vbTab两次,它解决了我的问题。

Set newLineNode= xmlDoc.createTextNode(vbCrLf & vbTab & vbTab)
parentNode.appendChild(newLineNode)