Avatar billede up2nogood Nybegynder
23. juli 2008 - 15:15 Der er 7 kommentarer og
1 løsning

Parsing, MSXML, XPATH? med VBS syntax

Hejsa,
Jeg skal i gang med at parse XML for at hive det ind i en ikke-SQL database.
Til formålet benytter jeg MSXML og har regnet med at skulle bruge XPath.

Jeg har brug for at hive projekter ud med numre, og smide de enkelte elementer ind kartoteker under projektet.
Altså for hvert projekt, skal element1, element2 etc. hives ud og så kører møllen igennem alle projekter...

Jeg savner lidt hints til at komme i gang.
Jeg har fået stated min Parser COM objekt op, og fået loaded dokumentet, nu skal jeg i gang med at lave en løkke der kører elementerne igennem og hiver data ud.

XML filen har følgende syntax:
- <TKI>
- <DELIVERY Version="1.1">
  <DELIVERY_DATE>2008-12-24</DELIVERY_DATE>
  <NO_OF_PROJECTS>4</NO_OF_PROJECTS>
- <PROJECTS>
+ <PROJECT>
  <PROJECT_DESC>Redecorating a Farm</PROJECT_DESC>
  <PROJECT_ID>111</PROJECT_ID>
- <CATEGORIES>
- <CATEGORY>
  <CATEGORY_CODE>11</CATEGORY_CODE>
  <CATEGORY_TEXT>Farm</CATEGORY_TEXT>
  </CATEGORY>
- <CATEGORY>
  <CATEGORY_CODE>16</CATEGORY_CODE>
  <CATEGORY_TEXT>Country joe</CATEGORY_TEXT>
  </CATEGORY>
  </CATEGORIES>
  <PROJECT_TEXT>Project is a farmer project, an example of thought</PROJECT_TEXT>
  </PROJECT>
- <PROJECT>
...
  </PROJECTS>
  </DELIVERY>
  </TKI>
Avatar billede arne_v Ekspert
23. juli 2008 - 15:30 #1
Til inspiration:

Set doc = CreateObject("MSXML.DOMDocument")
doc.Async = False
doc.Load("project.xml")
Set projects = doc.SelectNodes("//TKI/DELIVERY/PROJECTS/PROJECT")
For Each project In projects
    WScript.Echo project.SelectSingleNode("PROJECT_ID").Text
    WScript.Echo project.SelectSingleNode("PROJECT_DESC").Text
Next
Set projects = Nothing
Set doc = Nothing
Avatar billede up2nogood Nybegynder
25. juli 2008 - 08:29 #2
Tak for reply.
Den del har jeg fået til at spille.
Er der en måde at gennemløbe hver node eller child for hver projekt, uden at skulle navngi dem.
Altså lidt som "For Each" i projects.
Grunden til dette er, at der kan f.eks. være flere CATAGORY, hvor jeg skal have en form for gennemløb til at hive dem ud...
Eller er der en smartere metode til håndtere den del?
Avatar billede up2nogood Nybegynder
25. juli 2008 - 11:39 #3
Fik en For Each til at spille på hver  project.childNodes:
For Each project In projects
  Set prochildren = project.childNodes
  For Each prochild In prochildren
      WScript.Echo prochild.Text
  Next
Next

Det går fint, dog når jeg kommer til CATAGORY så vælger den blot at skrive alle data i en lang streng som: "11 Farm 16 joe"
Hvordan omgås dette?
Jeg vil jo gerne have mulighed for at få hvert element ud for sig som
"11"
"Farm" etc...
Avatar billede arne_v Ekspert
25. juli 2008 - 12:23 #4
Så skal du have en løkke indeni igen.

Måske skulle du bruge XPath igen fremfor at loope gennem alle childnodes. Den er
mere selectiv.
Avatar billede up2nogood Nybegynder
25. juli 2008 - 12:52 #5
Ok Arne,
Du har længe gjort dig fortjent til points på denne.
Men hvis jeg ikke skal gøre som loop eksemplet i min post, hvad skal jeg så?
Skal jeg tilbage til at selecte hver SingleNode i stedet?
Avatar billede arne_v Ekspert
25. juli 2008 - 15:19 #6
Udvidet inspiration:

Set doc = CreateObject("MSXML.DOMDocument")
doc.Async = False
doc.Load("project.xml")
Set projects = doc.SelectNodes("//TKI/DELIVERY/PROJECTS/PROJECT")
For Each project In projects
    WScript.Echo project.SelectSingleNode("PROJECT_ID").Text
    WScript.Echo project.SelectSingleNode("PROJECT_DESC").Text
    Set categories = project.SelectNodes("CATEGORIES/CATEGORY")
    For Each category in categories
        WScript.Echo "  " & category.SelectSingleNode("CATEGORY_CODE").Text
        WScript.Echo "  " & category.SelectSingleNode("CATEGORY_TEXT").Text
    Next
    Set categories = Nothing
Next
Set projects = Nothing
Set doc = Nothing

og svar.
Avatar billede up2nogood Nybegynder
25. juli 2008 - 15:44 #7
Jeg takker.
Du mener det er bedst at hente elementerne ud "by name" (SelectSingleNode), sådan så man ikke bare kører elementerne igennem med en hånd for øjnene?
Avatar billede arne_v Ekspert
25. juli 2008 - 16:27 #8
Det er nemmere at skrive og laese koden med XPath (by name) end med child nodes.

Saa medmindre du har usaedvanelige performance krav, saa vil jeg anbefale det.
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