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

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

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

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

Ответы [ 5 ]

1 голос
/ 18 апреля 2013

Просто написал подпрограмму 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
1 голос
/ 16 апреля 2011

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

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

1 голос
/ 15 марта 2011

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

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

0 голосов
/ 27 августа 2013

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

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

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

на:

If depth > 0 Then

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

0 голосов
/ 15 марта 2011

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

Удачи.

...