VBS для извлечения узлов из всех xml-документов в каталоге

#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:

Ключевые понятия:

  1. завершение цикла .Файлы папки
  2. фильтр для определенных файлов
  3. .Выберите узлы для списка желаемых узлов
  4. .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 — если ваша «новая» проблема настолько отличается от решаемой, что вы не можете решить ее, следуя только что изученным принципам, она заслуживает отдельного вопроса.