23. juli 2008 - 15:15Der 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>
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
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
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?
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...
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?
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
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?
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.
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.