2011-03-14 114 views
2

MSXML2.DOMDocumentを使用してVBAでXMLドキュメントを生成し、オブジェクトのXMLプロパティをリモートサーバー(POST経由)に送信しています。VBAでMSXML2 XMLドキュメントのテキストを出力するとき、新しい行を取得するにはどうすればよいですか?

MSXML2.DOMDocument.XMLの結果の文字列に改行がないため、XMLの大きなブロブです。ファイルをより人間が読めるようにするために、すべてのXML要素の後に新しい行を追加する方法がありますか?

サーバーで受信したファイルがすぐに解析され、情報がSQLデータベースに格納されるため、これは必須ではありませんが、開発とテストに役立ちます。

答えて

1

ファイルをディスクに書き込む前に関数を使用して、のすべてのインスタンスを">" & vbCrLfに置き換えることができます。

XMLをそのままディスクに保存し、FirefoxやIEで開くことができます。これは構文の強調表示を行う必要があります。

0

恐らくMSXMLの代わりにフリーウェアChilKat Xmlを見て、あなたの人生を楽にしてください。私はインデントとMSXMLの書式設定に苦労していることを覚えています。

幸運。

1

適切な解決策が見つかったのかどうかわかりませんが、msxmlでこの問題を調べていて、誰かがMXXMLWriterを使用して提案しました。 hereのように、出力をSAXパーサー(SAXXMLReader)にパイプし、MXXMLWriterにフックすることができます。 DOMDocumentがインデントする必要があるすべての情報を持っていることがわかっているときにxmlを再解析してフォーマットする必要があるのはややばかげていますが、そこにはあります。

実際に私はまだ探検する時間がありませんでしたが、明らかに、DOMDocmentではなくXMLを構築するためにSAXリーダーに接続されていないMXXMLWriterを使用して、代わりにインデントすることができます。 hereの説明を参照してください。

+0

ありがとう - 来週に試してみます – HorusKol

1

保存する前にindents XMLドキュメントのVBA subを書きました。インデントは、Visual Studioで書式設定するときに表示されるものと似ています。サブ要素やCDatasだけでなく、

Sub IndentXml(xml As IXMLDOMElement, Optional depth As Integer) 
    If IsMissing(depth) Then 
     depth = 0 
    End If 

    Dim txt As IXMLDOMText 

    If Not (xml.OwnerDocument.DocumentElement Is xml) Then 
     Set txt = xml.OwnerDocument.createTextNode(vbNewLine & String(depth, vbTab)) 
     xml.ParentNode.InsertBefore txt, xml 
    End If 

    Dim child As IXMLDOMNode 
    Dim hasElements As Boolean 
    hasElements = False 
    For Each child In xml.ChildNodes 
     If child.NodeType = NODE_ELEMENT Then 
      IndentXml child, depth + 1 
      hasElements = True 
     ElseIf child.NodeType = NODE_CDATA_SECTION Then 
      Set txt = xml.OwnerDocument.createTextNode(vbNewLine & String(depth + 1, vbTab)) 
      xml.InsertBefore txt, child 
      hasElements = True 
     End If 
    Next 

    If hasElements Then 
     Set txt = xml.OwnerDocument.createTextNode(vbNewLine & String(depth, vbTab)) 
     xml.appendChild txt 
    End If 
End Sub 
0

ありがとうDarth Jurassicあなたのコードです。とても便利な!

私自身のコードでは、 "If"ブロックが "xml.ParentNode"でNothingになってしまいました。

If Not (xml.OwnerDocument.DocumentElement Is xml) Then 

:私自身の目的のために、私はから次の行を変更し

If depth > 0 Then 

これは私が、私はそれを共有したいと考えて必要なもののためにうまく働きました。

+0

私の問題の理由は、このコードを実行した時点でDOM文書にルートノードを追加していないということでした。しかし、それはまだ私が作った変更で動作します! –

関連する問題