Парсинг XML - как перебрать дочерний узел и присвоить значение каждому
У меня есть следующий XML, который я пытаюсь проанализировать:
<host>
<object>
<objectname>Server1</objectname>
<objecttype>host</objecttype>
<location>USA</location>
<fcadapterports>
<port>
<portwwn>1000-0000-CCXX-B2B4</portwwn>
</port>
<port>
<portwwn>1000-0000-AW8D-23AB</portwwn>
</port>
</object>
</host>
Таким образом, я могу получать значения, пока не доберусь до portwwn, и я в пути над головой.
Пока у меня есть это -
Set objHosts = objConfigXml.selectNodes("//host/object")
For Each objMap in objHosts
Set objSingle = objMap
objSheet.Cells(iY,1).Value = objSingle.selectSingleNode("objectname").Text
objSheet.Cells(iY,2).Value = objSingle.selectSingleNode("objecttype").Text
objSheet.Cells(iY,3).Value = NEED HELP
objSheet.Cells(iY,4).Value = NEED HELP
objSheet.Cells(iY,5).Value = objSingle.selectSingleNode("location").Text
Затем мне нужно получить несколько значений для portwwn и назначить их следующим ячейкам в электронной таблице, таким как objSheet.Cells(iY,3) и objSheet.Cells(iY,4) и т. Д.
1 ответ
Этот демонстрационный скрипт:
Dim sXml : sXml = Join(Array( _
"<host>" _
, " <object>" _
, " <objectname>Server1</objectname>" _
, " <objecttype>host</objecttype>" _
, " <location>USA</location>" _
, " <fcadapterports>" _
, " <port>" _
, " <portwwn>1000-0000-CCXX-B2B4</portwwn>" _
, " </port>" _
, " <port>" _
, " <portwwn>1000-0000-AW8D-23AB</portwwn>" _
, " </port>" _
, " </fcadapterports>" _
, " </object>" _
, "</host>" _
))
Dim sXPath : sXPath = "/host/object/fcadapterports"
Dim objMSXML : Set objMSXML = CreateObject("Msxml2.DOMDocument")
objMSXML.setProperty "SelectionLanguage", "XPath"
objMSXML.async = False
objMSXML.loadXml sXml
If 0 = objMSXML.parseError Then
Dim ndFnd : Set ndFnd = objMSXML.SelectSingleNode(sXPath)
If ndFnd Is Nothing Then
WScript.Echo qq(sXPath), "not found"
Else
WScript.Echo ndFnd.xml
WScript.Echo ndFnd.childNodes(0).tagName, "1", ndFnd.childNodes(0).firstChild.text
WScript.Echo ndFnd.childNodes(1).tagName, "2", ndFnd.childNodes(1).firstChild.text
Dim nCol : nCol = 3
Dim ndChild
For Each ndChild In ndFnd.childNodes
WScript.Echo "col", nCol, ndChild.SelectSingleNode("portwwn").text
nCol = nCol + 1
Next
End If
Else
WScript.Echo objMSXML.parseError.reason
End If
Выход № 1:
End tag 'object' does not match the start tag 'fcadapterports'.
вывод № 2 (после закрытия тега):
<fcadapterports>
<port>
<portwwn>1000-0000-CCXX-B2B4</portwwn>
</port>
<port>
<portwwn>1000-0000-AW8D-23AB</portwwn>
</port>
</fcadapterports>
port 1 1000-0000-CCXX-B2B4
port 2 1000-0000-AW8D-23AB
col 3 1000-0000-CCXX-B2B4
col 4 1000-0000-AW8D-23AB
должен показать
- Как и почему проверки ошибок, чтобы поймать грубые ошибки, такие как ваши пропавшие
</fcadapterports>
- Доступ к дочерним узлам через index, firstChild и For Each
- Работа с дополнительной информацией - например, номерами столбцов - при циклическом просмотре коллекции (childNodes)
Обновление по комментариям:
это
Set nodeslist = objConfigXml.selectNodes("//host/object/fcadapterports/port")
For i = 0 To nodeslist.Length -1 Step 2
objSheet.Cells(iY,4).Value = nodeslist(i).Text & nodeslist(i+1).text
Next
Вид работ с 2 выпусками:
Он помещает все значения в одну ячейку Excel (потому что objSheet.Cells(iY,4) = ... каждый раз помещает все в objSheet.Cells(iY,4))
Он не выполняет итерацию - он выбирает только последнее значение (потому что пошаговый подсчитанный цикл - это нонсенс (и совершенно противоположный предложенному For For Each))
Я все еще испытываю желание написать заявление об отказе от ответственности:
Этот ответ должен использоваться программистами, а не художниками копирования и вставки, которые игнорируют все советы.
OTOH, может быть, изменить линию
WScript.Echo "col", nCol, ndChild.SelectSingleNode("portwwn").text
в
WScript.Echo ndChild.SelectSingleNode("portwwn").text, "should go in objSheet.Cells(iY," & nCol & ").Value"
новый вывод
cscript 22821889.vbs
..
1000-0000-CCXX-B2B4 should go in objSheet.Cells(iY,3).Value
1000-0000-AW8D-23AB should go in objSheet.Cells(iY,4).Value
поможет понять, что я имел в виду под "Работой с дополнительной информацией, например номерами столбцов, при циклическом сборе коллекции (childNodes)"