2015-11-25 3 views
0

Я пытаюсь редактировать файл XML DOM с помощью Excel VBA, но сталкивается с проблемами, выходящими за пределы узлов уровня 1. Мое требование состоит в том, чтобы изменять все (и только) текстовые узлы, но написанный мной сценарий изменяет все узлы уровня 1.Редактирование всех текстовых узлов XML DOM с помощью Excel VBA

Просьба уточнить изменения кода.

Входной XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Envelope> 
    <Body> 
     <Request> 
      <individual> 
       <hasName> 
        <firstName>ABC</firstName> 
        <lastName>DEF</lastName> 
       </hasName> 
       <birthDate>2015-01-10</birthDate> 
       <hasContact> 
        <type>Mobile</type> 
        <phoneAddress> 
         <countryCode>02</countryCode> 
         <localNumber>12345678</localNumber> 
        </phoneAddress> 
       </hasContact> 
      </individual> 
     </Request> 
    </Body> 
</Envelope> 

Excel VB Script:

Option Explicit 
Sub Test() 
Dim xmlDoc 
Dim colNodes 
Dim objNode 
Dim objNodesParam 

Set xmlDoc = CreateObject ("Microsoft.XMLDOM") 
xmlDoc.Async = "False" 
xmlDoc.Load("H:\Desktop\Request.xml") 
Set colNodes = xmlDoc.SelectNodes ("/Envelope/Body/Request/individual/*") 

For Each objNode In colNodes 
objNodeParam = "{{" & objNode.nodeName & "}}" 
objNode.Text = objNodeParam 
Next 

xmlDoc.Save "H:\Desktop\Request.xml" 

End Sub 

Фактический выход из вышеприведенного сценария:

<?xml version="1.0" encoding="UTF-8"?> 
    <Envelope> 
    <Body> 
     <Request> 
      <individual> 
       <hasName>{{hasName}}</hasName> 
       <birthDate>{{birthDate}}</birthDate> 
       <hasContact>{{hasContact}}</hasContact> 
      </individual> 
     </Request> 
    </Body> 
</Envelope> 

Ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?> 
<Envelope> 
    <Body> 
     <Request> 
      <individual> 
       <hasName> 
        <firstName>{{firstName}}</firstName> 
        <lastName>{{lastName}}</lastName> 
       </hasName> 
       <birthDate>{{birthDate}}</birthDate> 
       <hasContact> 
        <type>{{type}}</type> 
        <phoneAddress> 
         <countryCode>{{countryCode}}</countryCode> 
         <localNumber>{{localNumber}}</localNumber> 
        </phoneAddress> 
       </hasContact> 
      </individual> 
     </Request> 
    </Body> 
</Envelope> 

ответ

1

Для получения дополнительной информации см. here. Вам нужен рекурсивный подход:

Option Explicit 

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
Dim sFSpec : sFSpec = oFS.GetAbsolutePathName("..\data\33921005.xml") 
Dim oXML : Set oXML = CreateObject("Msxml2.DOMDocument.6.0") 
oXML.load sFSpec 
If 0 = oXML.parseError Then 
    recursiveTraversal oXML.documentElement, 0 
    WScript.Echo "===============" 
    WScript.Echo oXML.xml 
Else 
    WScript.Echo objMSXML.parseError.reason 
End If 

Sub recursiveTraversal(oElm, nIndent) 
    If oElm.nodeType = 3 Then 
    WScript.Echo Space(nIndent), oElm.text 
    oElm.text = "{{" & oElm.parentNode.tagName & "}}" 
    Else 
    WScript.Echo Space(nIndent), oElm.tagName 
    If 0 < oElm.childNodes.length Then 
     Dim oChild 
     For Each oChild In oElm.childNodes 
      recursiveTraversal oChild, nIndent + 2 
     Next 
    End If 
    End If 
End Sub 

выход:

cscript 33921005.vbs 
Envelope 
    Body 
    Request 
     individual 
     hasName 
      firstName 
      ABC 
      lastName 
      DEF 
     birthDate 
      2015-01-10 
     hasContact 
      type 
      Mobile 
      phoneAddress 
      countryCode 
       02 
      localNumber 
       12345678 
=============== 
<?xml version="1.0"?> 
<Envelope> 
     <Body> 
       <Request> 
         <individual> 
           <hasName> 
             <firstName>{{firstName}}</firstName> 
             <lastName>{{lastName}}</lastName> 
           </hasName> 
           <birthDate>{{birthDate}}</birthDate> 
           <hasContact> 
             <type>{{type}}</type> 
             <phoneAddress> 
               <countryCode>{{countryCode}}</countryCode> 
               <localNumber>{{localNumber}}</localNumber> 
             </phoneAddress> 
           </hasContact> 
         </individual> 
       </Request> 
     </Body> 
</Envelope> 
+0

Спасибо за быстрый ответ Гомер. Просто быстрый запрос будет работать для любого типа XML (независимо от того, насколько глубоко теги идут) –

Смежные вопросы