如何使用VB 6.0生成格式良好的XML文件?

5

我正在开发Visual Basic 6.0项目,需要生成一个格式良好的XML文件,其外观类似于以下内容:

<Myinfo>
      <FirstName>My First Name</FirstName>
      <LastName>My Last Name</LastName>
      <StreetAdd>My Address</StreetAdd>
<MyInfo>

注意:我已经完成了生成XML文件的工作,但我仍需要像上面显示的正确格式。
我生成的XML文件格式如下,全部在一行中:
<Myinfo><FirstName>My First Name</FirstName><LastName>My Last Name</LastName><StreetAdd>My Address</StreetAdd><MyInfo> .

4
就XML而言,您的示例XML文件是完全相同的。 - John Saunders
将XML显示为树形结构与其中的空格有什么关系? - John Saunders
可能是 如何使用VB6和MSXML漂亮地打印XML源代码? 的重复问题。 - Deanna
不是重复的问题。OP的问题中有提到MSXML吗?那个问题的回答可能会有关联。 - Ira Baxter
4个回答

4
我制作了一个小型的XML格式化程序,效果相当不错:
Sub PrettyPrint(Parent As IXMLDOMNode, Optional Level As Integer)
  Dim Node As IXMLDOMNode
  Dim Indent As IXMLDOMText

  If Not Parent.ParentNode Is Nothing And Parent.ChildNodes.Length > 0 Then
    For Each Node In Parent.ChildNodes
      Set Indent = Node.OwnerDocument.createTextNode(vbNewLine & String(Level, vbTab))

      If Node.NodeType = NODE_TEXT Then
        If Trim(Node.Text) = "" Then
          Parent.RemoveChild Node
        End If
      ElseIf Node.PreviousSibling Is Nothing Then
        Parent.InsertBefore Indent, Node
      ElseIf Node.PreviousSibling.NodeType <> NODE_TEXT Then
        Parent.InsertBefore Indent, Node
      End If
    Next Node
  End If

  If Parent.ChildNodes.Length > 0 Then
    For Each Node In Parent.ChildNodes
      If Node.NodeType <> NODE_TEXT Then PrettyPrint Node, Level + 1
    Next Node
  End If
End Sub

您可以通过传入DOMDocument对象并将Level参数留空来调用它。
它会对文档进行原地修改。
您将丢失可能存在的所有不重要的空格(XML元素之间的空格)。
它使用一个制表符进行缩进。
它还缩进注释和处理指令等。
它适用于所有版本的DOMDocument
Dim XmlDoc as New MSXML2.DOMDocument40

' create/load your xml document

PrettyPrint XmlDoc

MsgBox XmlDoc.xml

还有一种简单的方法可以通过SAX 来完成


1
你需要计算标签的嵌套层数,并输出与嵌套深度相对应的缩进。类似于以下代码(请原谅我糟糕的VB6语法):
Int Nesting=0
Bool LastOutputWasText=false

Sub XMLIndent
   Do I=1,Nesting
     Print " ";
   End Do
End Sub

Sub XMLOutputOpenTag(String OpenTag)
    if LastOutputWasText then
      Print
    endif
    XMLIndent
    Nesting=Nesting+1
    Print OpenTag;
    LastOutputWasText=true
End Sub

Sub XMLOutputCloseTag(String CloseTag)
    ! Always call OpenTag and CloseTag with matching Tag names
    if !LastOutputWasText then
       XMLIndent
    endif
    Print CloseTag
    Nesting=Nesting-1
    LastOutputWasText=false
End Sub

Sub XMLOutputText(String Text)
    Print Text;
    LastOutputWasText=true
End Sub

OP离开进行修改,将结果写入文件或任何他想要的地方。


1

你真的应该使用一个XML库来创建“正确”的XML。它可以处理编码、数据格式等问题。

Set XMLDoc = New DOMDocument
Set XMLRoot = XMLDoc.appendChild(XMLDoc.createElement("Myinfo"))
XMLRoot.appendChild(XMLDoc.createElement("FirstName")).Text = "My First Name"
XMLRoot.appendChild(XMLDoc.createElement("LastName")).Text = "My Last Name"
XMLRoot.appendChild(XMLDoc.createElement("StreetAdd")).Text = "My Address"

XMLDoc.xml 然后将输出有效的 XML,或者如果您真的想要的话,可以像 Tomalak 建议的那样进行漂亮的打印。


吹毛求疵:它将生成格式良好的XML。它是否有效是另一回事。 - Tomalak

0

对Tomalak的代码进行了一点改进,我在标签结束后添加了一个vbNewLine:

Private Sub FormatOuterXml(ByRef Parent As IXMLDOMNode, Optional ByVal Lvl As Long = 0)

    If Parent.ParentNode Is Nothing Or Parent.ChildNodes.Length = 0 Then Exit Sub

    Dim xn0 As IXMLDOMNode, id0 As IXMLDOMText, id1 As IXMLDOMText
    Set id0 = Parent.OwnerDocument.createTextNode(vbNewLine & String(Lvl, vbTab))

    If Lvl > 0 Then Set id1 = Parent.OwnerDocument.createTextNode(vbNewLine & String(Lvl - 1, vbTab))

    For Each xn0 In Parent.ChildNodes
        If xn0.NodeType = MSXML2.NODE_TEXT Then
            If LenB(xn0.Text) = 0 Then Parent.RemoveChild xn0
        ElseIf xn0.PreviousSibling Is Nothing Then
            Parent.InsertBefore id0.CloneNode(True), xn0
        ElseIf xn0.PreviousSibling.NodeType <> MSXML2.NODE_TEXT Then
            Parent.InsertBefore id0.CloneNode(True), xn0
        ElseIf xn0.NextSibling Is Nothing Then
            If Not id1 Is Nothing Then Parent.appendChild id1.CloneNode(True)
        End If
    Next xn0

    If Parent.ChildNodes.Length > 0 Then
        For Each xn0 In Parent.ChildNodes
            If xn0.NodeType <> MSXML2.NODE_TEXT Then FormatOuterXml xn0, Lvl + 1
       Next xn0
    End If

End Sub

嘿,这是一个递归函数,不确定为什么要叫PrettyPrint2,我已经将函数名更改为FormatOuterXml。 - Zhenya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接