Avatar billede babz Nybegynder
30. december 2004 - 23:00 Der er 13 kommentarer og
1 løsning

Xpath og asp

Jeg forsøger at redigere i dele af en xmlfil, og bruger XPath til at hente en knude fra mit xmltræ.....nu er jeg imidlertid en idiot til XPath...og jeg kan ikke få det til at spille....
Jeg kunne derfor godt tænke mig at få at vide om der er nogen der kender en snedig måde at checke det objekt man får fra eksempelvis obj.SelectSingleNode(XPath).

Jeg ville helst bare skrive det ud til skærmen men det virker ikke med Response.Write....
Hvad kan man så gøre????

/Babz
Avatar billede softspot Forsker
30. december 2004 - 23:21 #1
Hvad er det du vil checke objektet SelectSingleNode for?

(Jeg kan ikke garantere at nedestående fungerer i andet end MS ASP og MSXMLDOM).

Objektet har nogle egenskaber som er typisk benyttet, nemlig InnerText som indeholder alt tekst i den aktuelle node og Attributes som indeholder alle attributter i den aktuelle knude.

Indholder af det aktuelle knude kan altså hentes sådan her:

objNode.InnerText


Attributter kan hentes via

objNode.Attributes.GetNamedItem("attribut-navn")

og man kan oprette nye attributter med

objNode.Attributes.SetNameItem(xmldocument.CreateAttribute("attribut-navn"))

(objNode er den knude i XML-strukturen du ønsker at hente information om).

Attributtens værdi kan hentes og sættes via InnerText på det påg. attribut-objekt.

Hvis du skal bruge mere konkrete eksempler, må du sige til
Avatar billede babz Nybegynder
30. december 2004 - 23:46 #2
Efter hentning af knude vil jeg gerne koere obj.text = nogetandet
og derefter gemme xmlfilen.

Men hver gang har jeg problemer med 'obligatorisk objekt' fejl.
Derfor ville jeg gerne kunne checke den knude jeg faar tilbage fra SelectSingleNode, for at fejlfinde....da jeg ikke kan bruge 'obligatorisk objekt' til noget.
.....
Ioevrigt proevede jeg lige obj.InnerText....hvilket ogsaa returnerede 'obligatorisk objekt'

Nu smider jeg koden til XMLfilen her:
------------------------------
<?xml version="1.0" encoding="utf-8"?>
<aar>
    <uge>
    <ugenr>
    1
    </ugenr>
    <ugedag>
        <navn >
            mandag
        </navn>
        <dato >
            1-10-2004
        </dato>
        <arr>
            <tid >
                10-12
            </tid>
            <lokale>
                15.1.74
            </lokale>
            <text>
                <type>
                    blue
                </type>
                <link>
                http://localhost
                </link>
                <beskr>
                    Lokal server
                </beskr>
            </text>
        </arr>
               
    </ugedag>
</uge>
</aar>
---------------------------------------------------

Her kommer saa min aspfil.
--------------------------

Dim strUgenr
strUgenr = Request.QueryString("ugeNr")
Dim strUgeDag
strUgeDag = Request.QueryString("ugeDag")

'strItem afgør om der skal redigeres en dato eller et arrangement
Dim strItem
strItem = Request.QueryString("item")

Dim strDato 
Dim strTid
Dim strBeskr
Dim strType
Dim strLink
Dim strLokale

strDato = Request.Form("dato")

'lokale variabler.
Dim objDom
Dim objRoot

'lav en instans af et XMLDOM Objekt.
set objXML = Server.CreateObject("Microsoft.XMLDOM")

'Luk for asyncronous file loading.
objXML.async = false

'Hent XMLfilen.
objXML.load strXMLFil

'Sæt objRoot variablen til root-elementet af XMLfilen ved
'at kalde documentElement metoden af (XMLDOM)-objektet.
Set objRoot = objXML.documentElement

'Lav en reference til den (record) i XMLfilen vi gerne vil redigere
'ved at kalde SelectSingleNode metoden og give den
'nummeret på den pågældende uge.
Set objWeek = objRoot.SelectSingleNode("uge[ugenr='" & strUgenr & "']")
Set objDag = objWeek.SelectSingleNode("ugedag[navn='" & strUgeDag & "']")
Set objDato = objDag.SeslectSingleNode("ugedag[dato='" & strDato & "']")


'opdatering
'af værdierne i ugens felter.
objDato.text = strDato
   
   
   
'Efter redigering gemmer vi XMLfilen
objXML.save strXMLFile
-----------------------------------------

Her forsoeger jeg kun at aendre datoen....
Jeg er klar over at det ikke er snedig kode, men det irriterrer mig at jeg ikke kan finde ud af at debugge det, derfor ser det efterhaanden mere klumpet ud end det burde.

Haaber det giver lidt mening.

/B
Avatar billede softspot Forsker
30. december 2004 - 23:58 #3
Hmm.. kan det være fordi den ikke findes noget objekt og det derfor er Nothing, når du så forsøger at tildele en egenskab på dette ikke-initialiserede objekt kommer den fejl du oplever...?

Findes den uge du spørger efter i din XML-fil?
Avatar billede softspot Forsker
31. december 2004 - 00:00 #4
Næh hov! Den kode du har vist her på sitet, er det er tro kopi af den kode du sidder og kører på? Hvis det er tilfældet så skal du ændre flg. statement:

Set objDato = objDag.SeslectSingleNode("ugedag[dato='" & strDato & "']")

til

Set objDato = objDag.SelectSingleNode("ugedag[dato='" & strDato & "']")

Der er kommet et "s" for meget ind i SelectSingleNode...
Avatar billede babz Nybegynder
31. december 2004 - 00:07 #5
Nej det er ikke pga det ekstra s.....det har sneget sig ind under kopiering.

Angaaende nothing....s[ var det een af grundende til at jeg gerne ville kunne checke hvad det var der kom ud af min selectSingleNode.

/B
Avatar billede softspot Forsker
31. december 2004 - 00:14 #6
Jeg ved dette er helt basalt... men du kan jo bare checke om det SelectSingelNode returnerer er nothing

If Not objNode.SelectSingleNode(xpath) Is Nothing Then
  ' kode der manipulerer knudens indhold...
Else
  ' fejlhåndter...
End If

men jeg kan ikke tro det er der problemet ligger... eller hvad?
Avatar billede babz Nybegynder
31. december 2004 - 00:19 #7
Muligvis....men hvis den er nothing har jeg ingen ide om hvordan den bliver til something.
/B
Avatar billede babz Nybegynder
31. december 2004 - 00:24 #8
Tak for hj;lpen....jeg tror sengen kalder...
/B
Avatar billede softspot Forsker
31. december 2004 - 00:30 #9
Du kan prøve at beskrive den ønskede funktionalitet lidt mere, så kan det være vi kan finde en løsning på det problem :)

Godnat :)
Avatar billede babz Nybegynder
31. december 2004 - 10:40 #10
Mit objekt er Nothing...desværre, hvilket må betyde at min XPath stinker.
Jeg har lavet et script der kun bruger den første SelectSingleNode.
Den napper så en uge som vist ovenfor.
Set objWeek = objRoot.SelectSingleNode("uge[ugenr='" & strUgenr & "']")

Det giver stadig Nothing.
Jeg har prøvet at fifle lidt med XPath, men resultatet er stadig ingenting.
Hverken "uge[ugenr='" & strUgenr & "']/ugenr"
eller "uge/ugenr[.='" & strUgenr & "']"
giver andet end Nothing....
Hvordan strikker jeg en XPath sammen til den XMLfil der er vist ovenfor....vel og mærke een der virker.

Meningen med hele projektet her er at få en kalender op at køre over et år, hvor dato og forskellige arrangementer kan oprettes,redigeres og slettes. Jeg kommer jo ikke særligt langt hvis jeg ikke kan redigere i min xmlfil.

/B
Avatar billede softspot Forsker
31. december 2004 - 11:15 #11
Umiddelbart ser din XPath fin ud (altså den hvor du skriver: "uge[ugenr='" & strUgeNr & "']"). Hvis du vil være helt sikker på at du rent faktisk får hentet den ønskede knude i XML'en, kan du forsøge dig med "/aar/uge[ugenr='1']". Om ikke andet så får du testet om det overhovedet fungerer. Hvis det giver et resultat kan du indsætte din variabel. Hvis det også fungerer så har du vel egentlig en løsning... men den er lidt mindre fleksibel end "uge[ugenr='1']"...

Alternativt kan det være fordi du i dit XML har linieskift omkring dine data

eks.:
<ugenr>
1
</ugenr>

Prøv i stedet:
<ugenr>1</ugenr>

Jeg er ikke sikker på at dette er løsningen, men havde selv for en måneds tid siden et lignende problem hvor min tilsyneladende perfekte (;)) XPath heller ikke fungerede... netop af samme årsag.
Avatar billede babz Nybegynder
03. januar 2005 - 10:30 #12
Jahhh der var den.
Nu spiller det. Linieskift skal dø.

Mange tak for hjælpen SoftSpot
/baz
Avatar billede babz Nybegynder
03. januar 2005 - 10:32 #13
Smid et svar SoftSpot...og jeg skal straks fly dig nogle point.
/babz
Avatar billede softspot Forsker
03. januar 2005 - 18:15 #14
Godt det fungerer! :)
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