Синтаксический анализатор XML не знает длины пробелов

У меня есть следующий пример XML.

    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:f="http://kbcfp.com/BoTech/Inferno/Fault"
    xmlns:base="http://kbcfp.com/BoTech/Inferno/Base" xmlns:h="http://kbcfp.com/BoTech/Inferno/Header" xmlns:ep="http://torstonetech.com/Inferno/FDE">
    <SOAP-ENV:Header>
    <h:optLockSeqNumbers>
    <h:values><h:editSequenceNumber>1</h:editSequenceNumber><h:modifiedDateTime>2015-01-21T15:33:10+06:30</h:modifiedDateTime><h:modifiedUserId>1005</h:modifiedUserId><h:objectId>100100049</h:objectId><h:optimisticLockObjTypeId>11</h:optimisticLockObjTypeId></h:values>
    </h:optLockSeqNumbers>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
    <ep:AccountAttrs><ep:accountId>100100049</ep:accountId><ep:attrId>100001896</ep:attrId>
    <ep:AccountAttrs><ep:accountId> </ep:accountId><ep:attrId>100001896</ep:attrId></ep:AccountAttrs>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Я должен прочитать этот XML и ожидаемый результат, как показано ниже.

1st  ep:accountId 100100049
     ep:attrId 100001896
2nd  ep:accountId  <!-- want to write 1 space in these place -->
     ep:attrId 100001896

Это мой код парсера XML.

Dim xmlDoc As MSXML2.DOMDocument
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.LoadXML aboveXMLStringVale
Call readNode(xmlDoc.ChildNodes)

public Function readNode(ByRef nodes AS MSXML2.IXMLDOMNodeList)
Dim xmlNode As MSXML2.IXMLDOMNode
For Each xml Node In nodes
  If xmlNode.nodeType = NODE_TEXT Then
    ThisWorkbook.Worksheets("xxx").Cell(row,column) = xmlNode.ParentNode.ParentNode.nodeName
    ThisWorkbook.Worksheets("xxx").Cell(row,column) = xmlNode.ParentNode.nodeName
    ThisWorkbook.Worksheets("xxx").Cell(row,column) = "'" & xmlNode.NodeValue
  End If

  If xmlNode.HasChildNodes Then 
   Call readNode(xmlNode.ChildNodes)
  End If
Next
End Function

Код в порядке и покажет вывод, если текст дочернего узла XML не имеет пробела. Мое условие кода - проверить, есть ли у тега элемента XML значение или нет, используя условие "If xmlNode.HasChildNodes Then".
В случае пробелов нет дочернего узла и длины для объекта xmlNode.
Поэтому я не могу проверить условие и не могу записать значение тега элемента пробела, и их кодирование будет переходить к следующему тегу элемента XML.

Я очень благодарен за любую помощь и предложение.

Дополнение:
Это условие "If xmlNode.HasChildNodes Then" - проверка длины дочернего узла xmlNode.
например.
if childnode length > 0 return true, if not return false.
Как и в случае с пробелами, условие всегда будет возвращать false, потому что длина дочернего узла равна 0 для значения пробела.

1 ответ

Решение

Ваш анализатор XML игнорирует узел пробелов. Попробуйте изменить свойство DOMDocument.preserveWhiteSpace перед загрузкой XML.

Dim xmlDoc As MSXML2.DOMDocument
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.preserveWhiteSpace = true
xmlDoc.LoadXML aboveXMLStringVale

СОВЕТ: Вы используете парсер XML для разбора SOAP. У вас нет парсера / библиотеки SOAP?

Другие вопросы по тегам