Как получить новые строки при выводе текста для XML-документа MSXML2 в VBA?

Я создаю XML-документ в VBA с помощью MSXML2.DOMDocument, а затем отправляю XML-свойство объекта на удаленный сервер (через POST).

Результирующая строка в MSXML2.DOMDocument.XML не содержит символов новой строки, поэтому представляет собой один большой кусок XML. Есть ли способ заставить вывод помещать новую строку после каждого элемента XML, чтобы сделать файл более читабельным?

Это не совсем важно, поскольку файл, полученный на сервере, будет немедленно проанализирован, а информация сохранена в базе данных SQL, но это поможет при разработке и тестировании.


person HorusKol    schedule 14.03.2011    source источник


Ответы (5)


Вы можете просто заменить каждый экземпляр ">" на ">" & vbCrLf с помощью функции Replace перед записью файла на диск.

Или вы можете просто сохранить XML на диск как есть и открыть его с помощью Firefox или IE, которые должны выделить для вас синтаксис.

person rsbarro    schedule 14.03.2011

Не знаю, нашли ли вы подходящее решение / обходной путь, но я рассматривал эту проблему в msxml, и кто-то предложил использовать MXXMLWriter. Вы можете направить вывод через синтаксический анализатор SAX (SAXXMLReader) и подключить к нему MXXMLWriter, как описано здесь. Несколько нелепо повторно анализировать xml, чтобы отформатировать его, когда вы знаете, что в DOMDocument есть вся информация, необходимая для отступа, но она у вас есть.

На самом деле у меня еще не было времени на изучение, но, по-видимому, вы можете использовать MXXMLWriter, не подключенный к SAX-ридеру, для создания XML - вместо использования DOMDocment - и заставить его делать отступы по мере продвижения. См. Инструкции здесь.

person Eric G    schedule 16.04.2011

Просто написал подпрограмму VBA, которая делает отступ для XML-документа перед его сохранением. Отступы похожи на то, что я вижу при форматировании в 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
person Darth Jurassic    schedule 18.04.2013

Может быть, вам стоит взглянуть на бесплатное программное обеспечение ChilKat Xml вместо ужасного MSXML и упростить себе жизнь . Я помню, как боролся с отступом и форматированием в MSXML, и знаю, как это расстраивает.

Удачи.

person John Alexiou    schedule 15.03.2011

Спасибо, Дарт Юрский за ваш код. Очень кстати!

В моем собственном коде второй блок «If» споткнулся о том, что «xml.ParentNode» был Nothing. Для своих целей я изменил следующую строку с:

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

to:

If depth > 0 Then

Это отлично сработало для того, что мне нужно, поэтому подумал, что поделюсь им.

person Mike R    schedule 27.08.2013
comment
Причина моей проблемы заключалась в том, что я не добавил корневой узел к документу DOM в момент запуска этого кода. Но он по-прежнему работает с внесенной мной модификацией! - person Mike R; 28.08.2013