4

Visual Basic 6.0プロジェクトに取り組んでおり、次のような適切にフォーマットされたXMLファイルを生成する必要があります。

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

注:XMLファイルの生成は完了しましたが、上記のように正しいフォーマットが必要です。

私が生成したXMLファイルは、次のように1行でフォーマットされています。

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

4 に答える 4

3

私は非常にうまく機能する小さな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要素間の空白)はすべて失われます。
  • 1つのタブを使用してインデントします。
  • また、コメントや処理命令などをインデントします。
  • のすべてのバージョンで動作しますDOMDocument
Dim XmlDoc as New MSXML2.DOMDocument40

' create/load your xml document

PrettyPrint XmlDoc

MsgBox XmlDoc.xml

SAXを介してそれを行う簡単な方法もあります。

于 2012-04-18T09:11:38.840 に答える
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が提案するようにきれいに印刷できます。

于 2012-04-18T15:17:34.907 に答える
0

タグのネストをカウントし、ネストの深さに対応するインデントを出力する必要があります。(私の悪い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は、ファイルまたは結果が必要な場所に書き込むためにこれを修正するために残しました。

于 2012-04-18T08:19:28.350 に答える
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
于 2013-08-22T21:44:28.200 に答える