如何使用VB6.0生成格式良好的XML文件?

如何使用VB6.0生成格式良好的XML文件?,xml,vb6,Xml,Vb6,我正在从事Visual Basic 6.0项目,需要生成一个格式良好的XML文件,其如下所示: <Myinfo> <FirstName>My First Name</FirstName> <LastName>My Last Name</LastName> <StreetAdd>My Address</StreetAdd> <MyInfo> <Myinfo&g

我正在从事Visual Basic 6.0项目,需要生成一个格式良好的XML文件,其如下所示:

<Myinfo>
      <FirstName>My First Name</FirstName>
      <LastName>My Last Name</LastName>
      <StreetAdd>My Address</StreetAdd>
<MyInfo>
<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>
<Myinfo><FirstName>My First Name</FirstName><LastName>My Last Name</LastName><StreetAdd>My Address</StreetAdd><MyInfo> .
我的名字我的姓我的地址。

您需要计算标签的嵌套,并输出与嵌套深度对应的缩进。类似(请原谅我糟糕的VB6语法):


OP留下来修改它,将其写入一个文件或任何他想要得到结果的地方。

我制作了一个小型XML漂亮打印机,它工作得非常好:

子预打印(父级为IXMLDOMNode,可选级别为整数)
作为IXMLDOMNODONDE的Dim节点
将缩进尺寸调整为IXMLDOMText
如果不是Parent.ParentNode为Nothing且Parent.ChildNodes.Length>0,则
对于Parent.ChildNodes中的每个节点
设置缩进=Node.OwnerDocument.createTextNode(vbNewLine和String(级别,vbTab))
如果Node.NodeType=Node\u TEXT,则
如果Trim(Node.Text)=“”,则
Parent.RemoveChild节点
如果结束
ElseIf Node.PreviousSibling则为空
Parent.InsertBefore缩进,节点
ElseIf Node.PreviousSibling.NodeType Node\u TEXT然后
Parent.InsertBefore缩进,节点
如果结束
下一节点
如果结束
如果Parent.ChildNodes.Length>0,则
对于Parent.ChildNodes中的每个节点
如果是Node.NodeType节点\文本,则预打印节点,级别+1
下一节点
如果结束
端接头
您可以通过传入
DOMDocument
对象并将
Level
参数留空来调用它

  • 它对文档进行就地修改
  • 您将丢失所有可能存在的不重要空白(XML元素之间的空白)
  • 它使用一个制表符缩进
  • 它还缩进注释和处理说明等
  • 它将适用于所有版本的
    DOMDocument
Dim XmlDoc作为新的MSXML2.DOMDocument40
'创建/加载xml文档
预打印XmlDoc
MsgBox XmlDoc.xml

还有一种简单的方法。您确实应该使用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的建议将其打印出来。

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
Private子格式outerxml(ByRef Parent作为IXMLDOMNode,可选ByVal Lvl作为Long=0)
如果Parent.ParentNode为Nothing或Parent.ChildNodes.Length=0,则退出Sub
Dim xn0作为IXMLDOMNode,id0作为IXMLDOMText,id1作为IXMLDOMText
Set id0=Parent.OwnerDocument.createTextNode(vbNewLine和String(Lvl,vbTab))
如果Lvl>0,则设置id1=Parent.OwnerDocument.createTextNode(vbNewLine&String(Lvl-1,vbTab))
对于Parent.ChildNodes中的每个xn0
如果xn0.NodeType=MSXML2.NODE_TEXT,则
如果LenB(xn0.Text)=0,则Parent.RemoveChild xn0
否则,以前的兄弟姐妹就什么都不是了
Parent.InsertBefore id0.CloneNode(True),xn0
ElseIf xn0.PreviousSibling.NodeType MSXML2.NODE_TEXT然后
Parent.InsertBefore id0.CloneNode(True),xn0
否则xn0.NextSibling什么都不是
如果Not id1为Nothing,则Parent.appendChild id1.CloneNode(True)
如果结束
下一个xn0
如果Parent.ChildNodes.Length>0,则
对于Parent.ChildNodes中的每个xn0
如果是xn0.NodeType MSXML2.NODE_文本,则FormatOuterXml xn0,Lvl+1
下一个xn0
如果结束
端接头

就XML而言,您的示例XML文件是相同的。显示为树与XML中的空白有什么关系?可能是重复的,而不是重复的。OP的问题中哪里提到了MSXML?这个问题的答案可能是相关的。它是否有效是另一回事。嘿,这是一个递归函数,不知道为什么它被称为PrettyPrint2,我已经将函数名更改为FormatOuterXml