2015-03-08 4 views
1

Как я могу получить данные компании, имя, фамилию, номер мобильного телефона, адрес электронной почты, страны, города и zipcode для каждого клиента из нижеследующего xml? Я пробовал следующий код, но когда какое-то значение отсутствует (например, электронная почта в первой записи), код присваивает значение из следующей записи, поэтому «ABCars» получает «[email protected]».Перемещение и фильтрация узлов xml в VBScript

Кроме того, знаете ли вы, как я могу отфильтровать загруженные записи, чтобы только записи с номером мобильного телефона, не существующим в другом наборе записей, остались (набор записей не включен в приведенный ниже код)?

Set xmlDoc = CreateObject("Msxml2.DOMDocument") 
xmlDoc.async="false" 
xmlDoc.setProperty "SelectionLanguage", "XPath" 
xmlDoc.load("test.xml") 

set nodes=xmlDoc.SelectNodes("//customer") 
for i=0 to nodes.length-1 
set company=xmlDoc.SelectNodes("//customer/company") 
set firstname=xmlDoc.SelectNodes("//customer/firstname") 
set lastname=xmlDoc.SelectNodes("//customer/lastname") 
set mobile=xmlDoc.SelectNodes("//customer/mobile") 
set email=xmlDoc.SelectNodes("//customer/email") 
set country=xmlDoc.SelectNodes("//customer/address/country") 
set city=xmlDoc.SelectNodes("//customer/address/city") 
set zipcode=xmlDoc.SelectNodes("//customer/address/zipcode") 

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
    <category>Cars</category> 
    <customers> 
     <customer> 
      <company>ABCars</company> 
      <firstname>Peter</firstname> 
      <lastname>Heinrich</lastname> 
      <mobile>9141453027</mobile> 
      <address> 
       <country>Germany</country> 
       <city>Berlin</city> 
       <zipcode>12345</zipcode> 
      </address> 
     </customer> 
     <customer> 
      <company>Best Cars</company> 
      <firstname>George</firstname> 
      <lastname>Wood</lastname> 
      <mobile>123456789</mobile> 
      <email>[email protected]</email> 
      <address> 
       <country>Great Britain</country> 
       <city>Leicaster</city> 
       <zipcode>67890</zipcode> 
      </address> 
     </customer> 
    </customers> 
</list> 

С уважением, Przemek

ответ

2

Ваш цикл проходит через nodes коллекции, но тело цикла запрашивает весь документ для каждой итерации, так что вы делаете тот же запрос, каждый time - использовать возвращенные узлы в качестве контекстных узлов для выбора узлов относительно этого узла:

set nodes=xmlDoc.SelectNodes("//customer") 
for i=0 to nodes.length-1 
    ' get the current node 
    set node = nodes(i) 
    ' run xpath relative to the current node 
    set company = node.selectSingleNode("company") 
    set firstname = node.selectSingleNode("firstname") 
    set lastname = node.selectSingleNode("lastname") 
    set mobile = node.selectSingleNode("mobile") 
    set email = node.selectSingleNode("email") 
    set country = node.selectSingleNode("address/country") 
    set city = node.selectSingleNode("address/city") 
    set zipcode = node.selectSingleNode("address/zipcode") 

next 

Если нет найдено по запросу XPath, Nothing будет возвращен узла, который вы можете проверить и маршрут соответствующим образом:

set company = node.selectSingleNode("company") 
if company is Nothing then 
    ' do something if no company, eg break loop 
    exit for 
end if 

Для фильтрации, вы можете создать свой XPath запрос, чтобы выбрать только те узлы, которые Арен в этом списке, например

dim xpath: xpath = Empty 

do until recordset.EOF 
    if xpath <> "" then 
     xpath = xpath & " and " 
    end if 
    xpath = xpath & "mobile != '" & recordset("mobile") & "'" 

    recordset.MoveNext 
loop 

if xpath <> "" then 
    xpath = "[" & xpath & "]" 
end if 

' eg you end up with something like "//customer[mobile != 123456789 and mobile != 987654321]" 
set nodes = xmldoc.selectNodes("//customer" & xpath) 
+0

Отлично, большое спасибо! Мне просто интересно, есть ли более простой способ фильтрации записей, например. используя фильтр() - http://www.w3schools.com/vbscript/func_filter.asp? Может ли он использоваться с набором записей? –

+0

@PrzemyslawWojda Набор записей ADODB имеет свою собственную функцию «Фильтр»: http://stackoverflow.com/q/1510860/3898606 –

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