2014-05-15 2 views
0

По какой-то причине я не могу выполнить эту работу. У меня есть следующий XML с двумя регистрационными узлами. Все, что мне нужно, это вернуть <serialnumber> (который в настоящее время выполняет скрипт) в качестве значения переменной и все <id>, <qty> для этого <serialnumber>.Анализ XML с помощью скрипта VB

я могу получить насколько «серийный номер» (см код ниже), но не могу показаться, чтобы получить петлю для индивидуального <module> работать для того, чтобы получить все <id>, <qty>. Я получение объекта не поддерживать это свойство или метод: 'ModuleList.length' ответ

================================================================================================================================================================================= =======

<root> 
<registration> 
    <name>For Test</name> 
    <serialnumber>1234567890</serialnumber> 
    <modules> 
     <module> 
      <name>SERVER : A</name> 
      <id>15</id> 
      <qty>1</qty> 
     </module> 
     <module> 
      <name>SERVER : B</name> 
      <id>40</id> 
      <qty>1</qty> 
     </module> 
    </modules> 
</registration> 
<registration> 
    <name>For Test</name> 
    <serialnumber>0987654321</serialnumber> 
    <modules> 
     <module> 
      <name>SERVER : 1</name> 
      <id>15</id> 
      <qty>1</qty> 
     </module> 
     <module> 
      <name>SERVER : 2</name> 
      <id>40</id> 
      <qty>1</qty> 
     </module> 
     <module> 
      <name>SERVER : 3</name> 
      <id>15</id> 
      <qty>1</qty> 
     </module> 
     <module> 
      <name>SERVER : 4</name> 
      <id>40</id> 
      <qty>1</qty> 
     </module> 
    </modules> 
</registration> 
</root> 

===================== VB Script ============= ===

Set objXML = Server.CreateObject("Msxml2.DOMDocument") 

objXML.LoadXml(xmlString) 

Set Root = objXML.documentElement 
Set registrationList = Root.getElementsByTagName("registration") 

For i = 0 to registrationList.length -1 

    Set serialnumber = objXML.getElementsByTagName("serialnumber")(i) 

    Set ModuleList = Root.getElementsByTagName("modules")(i) 

    For x = 0 to ModuleList.length -1 

     Set module = objXML.getElementsByTagName("module")(x) 

     Response.Write module.text ' this is where I was expecting to stuff the array 


    Next 


    Response.Write serialnumber.text & " " 

Next 

Set objXML = Nothing 

ответ

2

XML - это структурированные данные, поэтому для его работы используйте структурированный метод (XPath). Repeated/Nested getElementsByTagName() освобождают иерархические отношения. В Код:

Dim oFS  : Set oFS  = CreateObject("Scripting.FileSystemObject") 
    Dim sFSpec : sFSpec  = goFS.GetAbsolutePathName("..\testdata\xml\so23686152.xml") 
    Dim objMSXML : Set objMSXML = CreateObject("Msxml2.DOMDocument") 
    objMSXML.setProperty "SelectionLanguage", "XPath" 
    objMSXML.async = False 
    objMSXML.load sFSpec 

    If 0 = objMSXML.parseError Then 
    Dim ndlReg : Set ndlReg = objMSXML.selectNodes("/root/registration") 
    Dim ndReg 
    For Each ndReg In ndlReg 
     WScript.Echo ndReg.selectSingleNode("serialnumber").text 
     Dim ndMod 
     For Each ndMod In ndReg.selectNodes("modules/module") 
      WScript.Echo " " _ 
          , ndMod.firstChild.text _ 
          , ndMod.selectSingleNode("id").text _ 
          , ndMod.childNodes(2).text 
     Next 
    Next 
    Else 
    WScript.Echo objMSXML.parseError.reason 
    End If 

выхода:

1234567890 
    SERVER : A 15 1 
    SERVER : B 40 1 
0987654321 
    SERVER : 1 15 1 
    SERVER : 2 40 1 
    SERVER : 3 15 1 
    SERVER : 4 40 1 
-1

Почему бы вам не использовать регулярное выражение для этого?

Const ForReading = 1 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("test.xml", ForReading) 

text = objFile.ReadAll 

Dim serialNumber 
Set objRE = New RegExp 
objRE.pattern = "<serialnumber>([0-9]+)</serialnumber>" 
Set matches = objRE.execute(text) 
if matches.count > 0 then 
    serialNumber = matches.item(0).submatches.item(0) 
end if 
+0

Поскольку это XML, а не текст. (-1) –

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