#xml #vbscript
#xml #vbscript
Вопрос:
У меня есть приведенный ниже VBS, который извлекает два атрибута из одного фрагмента xml, я хотел бы изменить код, чтобы посмотреть в каталоге данных и извлечь эти два атрибута для всех xml-документов внутри.
Также было бы неплохо, если бы можно было поместить выходные данные из каждого файла в одну строку.
Имя пользователя — идентификатор, а не текущий
Имя пользователя
ID
Set objXML2 = CreateObject("Microsoft.XMLDOM")
objXML2.async = "false"
strdir="c:tempXMLDatatest.xml"
If (Not objXML2.load(strdir)) Then
wscript.echo "Unable to load file '" amp; strdir amp; "'. "
WScript.Quit(1)
End If
Set colNodes1 = objXML2.selectNodes ("/User/Username")
For Each objNode in colNodes1
wscript.echo objnode.getAttribute("name") amp; objNode.text
NEXT
Set colNodes2 = objXML2.selectNodes ("/User/ID")
For Each objNode in colNodes2
wscript.echo objnode.getAttribute("name") amp; objNode.text
NEXT
Небольшой пример xml, будут разные теги, но формат будет тот же.
<Batch>
<User>
<Username>Ignatius</Username>
<Department>IT</Department>
<ID>123456</ID>
</User>
</Batch>
Как я мог бы также извлечь город из приведенного ниже XML? В ту же строку? А также поместить это в текстовый файл?
<Batch>
<User>
<Detail>
<Username>Ignatius</Username>
<Department>IT</Department>
<ID>123456</ID>
</Detail>
<Location>
<Town>London</Town>
</Location>
</User>
</Batch>
Комментарии:
1. пожалуйста, опубликуйте (небольшой) образец вашего .XML.
2. итак, почему вы запрашиваете извлечение атрибута ??
3. Привет @Ekkehard. Хорнер, пожалуйста, смотрите пример xml выше. В каталоге будет много файлов одного формата (пока неизвестно, сколько в день), необходимых для извлечения данных из всех файлов в текстовый документ. Итак, из приведенного выше примера в одной строке будет: Ignatius_123456
Ответ №1:
Ключевые понятия:
- завершение цикла .Файлы папки
- фильтр для определенных файлов
- .Выберите узлы для списка желаемых узлов
- .SelectSingleNode для отдельных узлов (сюрприз!)
Как используется здесь:
Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject")
Dim objXML : Set objXML = CreateObject("MSXML2.DOMDocument")
objXML.async = false
Dim oFile
For Each oFile In oFS.GetFolder("..data").Files
WScript.Echo oFile.Path
If 1 = InStr(oFile.Name, "24607266") Then
objXML.load oFile.Path
If objXML.parseError Then ' never without my check
WScript.Echo objXML.parseError.reason
Else
Dim sXPath : sXPath = "/Batch/User"
Dim ndlUsers : Set ndlUsers = objXML.selectNodes(sXPath)
If 0 = ndlUsers.length Then ' never without my check
WScript.Echo "fail:", sXPath
Else
Dim ndUser
For Each ndUser In ndlUsers
' no attribs!
' WScript.Echo ndUser.getAttribute("Name"), ndUser.getAttribute("Id")
WScript.Echo ndUser.selectSingleNode("Username").text, ndUser.selectSingleNode("ID").text
Next
End If
End If
End If
Next
(Начните свое исследование здесь.)
Комментарии:
1. @user3811820 — если ваша «новая» проблема настолько отличается от решаемой, что вы не можете решить ее, следуя только что изученным принципам, она заслуживает отдельного вопроса.