07. februar 2007 - 16:54Der er
2 kommentarer og 1 løsning
Hente XML værdier vha XMLdom og xpath
Jeg forsøger at udhente nogle værdier, og vil gerne have nogle indre loops, men er ikke sikker på syntaksen. Grundlæggende bruger jeg: Set objXML = Server.CreateObject("Microsoft.XMLDOM") set nodes = objXML.selectNodes("root/table/table[@name='agendaitem']/fields/field[@name='name']") for each N in nodes DOC_OUT = N.text next
Og det virker fint, men jeg har nogle tables inde i andre tables (se nedenstående eksempel) hvor jeg gerne vil hente det ud i loop - lidt ala: set nodes = objXML.selectNodes("root/table/table[@name='agendaitem']/fields/field[@name='name']") for each N in nodes set innernodes = N.selectNodes("/fields/field[@name='name']") for each M in innernodes DOC_OUT = M.text next next
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Hmm... jeg er ikke helt sikker på om jeg har forstået hvordan du vil have data trukket ud (dvs. om strukturen skal bibeholdes eller om det bare skal ud i en lang liste). Hvis det bare skal ud i en lang liste kan du klare det ved at benytte dobbelt skråstregen --> //, som indikerer at det efterfølgende XPath-møsnter skal matches på alle niveauer under det niveau hvor // forefindes.
Eksempel:
Din egen version finder alle field-noder som ligger i fields-noder under table-noder med name='agendaitem' - og kun på det niveau:
set nodes = objXML.selectNodes("root/table/table[@name='agendaitem']/fields/field[@name='name']")
Hvis du benytter // foran fields i den XPath så vil den finde alle field-noder under fields-noder, således:
set nodes = objXML.selectNodes("root/table/table[@name='agendaitem']//fields/field[@name='name']")
Jeg har selv forsøgt lidt videre. Kunne ikke lige se hvorledes jeg kunne løse min problemstilling med dit foreslag, men var nok mig der ikke forklarede problemet ordentligt Det som var formålet var, at kunne tage værdien af en node og gemme som asp variabel. For derefter at gemme dem i en database. Jeg endte med at løse det med: count = 0 set nodes = objXML.selectNodes("root/table/table[@name='agendaitem']/fields/field[@name='name']") for each N in nodes count = count+1 next for i = 0 to count set nodes = objXML.selectNodes("root/table/table[@name='agendaitem'][i]/fields/field for each N in nodes minVariabel = N.text 'Indsæt minVariable i database next next
Hmm.. OK, det ser bare ikke ud til at det burde fungere (ikke med den XML-struktur du har vist i spørgsmålet), idet der ikke er nogen table-nodes på 3 niveau, som har en name-atribut med værdien "agendaitem" (hvilket også er tilfældet for det kode jeg så har vist). Ydermere optæller du antallet af field-nodes hvor name-atribut har værdien "name", men du gennemløber alle field-nodes under de respektive table-nodes hvor name-atributten har værdien "agendaitem" (muligvis pga. nedennævnte copy/paste problematik).
Desuden er der en syntaktisk fejl i 6. sidste linie, men det antager jeg beror på en copy/paste-fejl...
Bort set fra det, så tror jeg du kan spare lidt processortid ved at benytte nodes.Count (den hedder muligvis nodes.length) i stedet for at gennemløbe din nodes-collection for at tælle antal nodes i denne løkke:
count = 0 set nodes = objXML.selectNodes("root/table/table[@name='agendaitem']/fields/field[@name='name']") for each N in nodes count = count+1 next
Men hvordan din løsning løser opgaven med at der kan være indlejrede table-nodes i table-nodes har jeg svært ved at se, men hvis du siger det løser problemet, så kan jeg vel ikke sige så meget til det (jeg synes bare ikke det var det spørgsmålet lagde op til)... :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.