Avatar billede jonbdk Nybegynder
07. februar 2007 - 16:54 Der 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


<root>
    <table name="agendaitem">
        <fields>
            <field name="sysid">5</field>
            <field name="name">bla bla bla</field>
        </fields>
        <table name="bullet">
            <fields>
                <field name="bulletname">overskrift1</field>
                <field name="bulletcontent">bla bla bla</field>
            </fields>
        </table>
        <table name="bullet">
            <fields>           
                <field name="bulletname">overskrift2</field>
                <field name="bulletcontent">bla bla bla</field>
            </fields>
        </table>
    </table>
    <table name="agendaitem">
        <fields>
            <field name="sysid">6</field>
            <field name="name">et andet navn</field>
        </fields>
        <table name="bullet">
            <fields>
                <field name="bulletname">overskrift4</field>
                <field name="bulletcontent">bla bla bla</field>
            </fields>
        </table>
        <table name="bullet">
            <fields>
                <field name="bulletname">overskrift5</field>
                <field name="bulletcontent">bla bla bla</field>
            </fields>
        </table>
    </table>
    <agendaData>
        <org>jNb</org>
    </agendaData>
</root>

Er der nogen der kan hjælpe med den rigtige syntaks?
Avatar billede softspot Forsker
09. februar 2007 - 13:40 #1
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']")
Avatar billede jonbdk Nybegynder
13. marts 2007 - 10:43 #2
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
Avatar billede softspot Forsker
13. marts 2007 - 11:17 #3
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)... :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester