Avatar billede jaffafo Nybegynder
27. februar 2004 - 11:19 Der er 13 kommentarer og
5 løsninger

Hente et enkelt Element fra XML

Jeg har en NyhedsUC hvor nyhederne bliver hentet fra en XML.

Når man så trykker på overskriften på en nyhed reloades siden og så har den smidt en querystring med en NyhedID.

Nu skal siden så loade den nyhed med den ID from og smide det i en datagrid.

men hvordan?
Avatar billede jaffafo Nybegynder
27. februar 2004 - 11:20 #1
Kan man f.eks. ikke bare smide en SQL på en XML?  :)
Avatar billede dj Nybegynder
27. februar 2004 - 17:44 #2
Hvis du har en XmlDocument som du har loadet XML'en ind i, kan du benytte en XPATH expression f.eks:

XML:

<newsdoc>
  <news ID="1">
    blah blah
  </news>
  <news ID="2">
    blah blah
  </news>
</newsdoc>

C#:

XmlDocument ODoc = new XmlDocument("news.xml");
XmlNode ONewsNode = ODoc.SelectSingleNode("//newsdoc/news[@ID = '" + Request.Params["NewsID"] + "']");

Så får du en node ud der indeholder oplysningerne om den givne nyhed og så er det bare at overføre den relevante data til datagriddet. Jeg går ud fra det er ovenstående der volder dig problemer og ikke datagriddet :)

Hvis du har brug for yderligere oplysninger så prøv at slå XmlDocument og XmlNode op i din MSDN documentation.
Avatar billede jaffafo Nybegynder
27. februar 2004 - 20:18 #3
ikke for at være besværlig..  men kan du give det i VB.net? :-)

men jo det ser ud til at være det jeg leder efter...

så hvis nogen gider omsætte det til vb.net...  pliis.. :)
Avatar billede dj Nybegynder
27. februar 2004 - 21:02 #4
tjoh tjah nu har jeg ikke lige den store erfaring med VB.NET syntax, men jeg vil tro det må se ud noget ala sådan her:

Dim ODoc As New XmlDocument("news.xml")
Dim ONewsNode As XmlNode
ONewsNode = ODoc.SelectSingleNode("//newsdoc/news[@ID = '" & Request.Params("NewsID") & "']")

Igen, prøv at slå de 2 keywords "XmlDocument" og "XmlNode" op i din .NET dokumentation, der er også eksempler med VB kode :)
Avatar billede jaffafo Nybegynder
28. februar 2004 - 13:16 #5
Public Sub Load_nyheder()   
    Dim xmlfilnavn as string = server.MapPath("xml/nyheder.xml")
    Dim Nyheder as New dataset()
   
    try
           
        Dim objXMLdoc As New XmlDocument()
        objXMLdoc.Load(xmlfilnavn)
       
        Dim Nyhed as XmlNode
        Dim nodeList as XmlNodeList
        Dim root as XmlNode = objXMLdoc.DocumentElement

        nodeList=root.SelectNodes("descendant::Nyhed[NyhedID='1!']")
       
        dgnyheder.datasource = nodeList
        dgnyheder.databind()
       
        'for each Nyhed in nodeList     
        '  news.text = "Siden oppe!" & "<br />"
        'next
       
    catch t as exception
        response.write(t.tostring())
    end try
end sub


nu begynder det at ligne noget, men det virker ikke.. :(

der kommer ingen fejl, men den viser hellere ikke noget
Avatar billede jaffafo Nybegynder
28. februar 2004 - 13:55 #6
Jeg har rimelig travtl nu..  har nogen en løsning der gør det muligt at hente en enkelt nyhed fra en XML som kan smides i en datagrid/datalist/label - whatever?..

vil gerne give mere points hvis det hjælper?
Avatar billede dj Nybegynder
28. februar 2004 - 14:21 #7
Din fejl er formentlig at du prøver at databinde en nodelist til dit datagrid og det kan den formentlig ikke finde ud af.

Ta et kig på den her artikel: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuiwebcontrolsdatagriditemclasstopic.asp

Du kan formentlig anvende en DataRow som vist i det eksempel og så iterere din NodeList og oprette et DataRow objekt for hver af dem og tilføje dem til en collection som du så kan databinde på din DataGrid.
Bemærk at du hiver teksten i en XML node ud ved hjælp af XmlNode.InnerText

Jeg vil ikke skrive al koden for dig (medmindre du kan klare dig med C#), men ovenstående burde kunne hjælpe dig på vej.

En ting der undrer mig er dog at du vil anvende et DataGrid til visning af en bestemt nyhed .. normaltvis anvender man kun den control i forbindelse med f.eks. en liste over nyheder.
Avatar billede jaffafo Nybegynder
28. februar 2004 - 14:28 #8
ja, men det er faktisk ligemeget hvordan det bliver vist..  det skal bare vises..  :)

det kan man jo altid ordne bagefter.. :-)
Avatar billede dj Nybegynder
28. februar 2004 - 15:08 #9
pointen er lidt at hvis du bare skal have vist en enkelt nyhed, så er det væsentligt nemmere at gøre således:

Public Function Load_Nyhed() As String

Dim xmlfilnavn as string = server.MapPath("xml/nyheder.xml")
Dim result as string   
  try
         
    Dim objXMLdoc As New XmlDocument()
    objXMLdoc.Load(xmlfilnavn)
       
    Dim Nyhed as XmlNode
    Dim nodeList as XmlNodeList
    Dim root as XmlNode = objXMLdoc.DocumentElement

    XmlNode OXmlNode = root.SelectSingleNode("descendant::Nyhed[NyhedID='1!']")
    result = OXmlNode.InnerText

    catch t as exception
        response.write(t.tostring())
    end try

    Load_Nyhed = result
end sub

og så i din ASP kode skrive <%= Load_Nyhed() %> der hvor den skal indsættes.
Avatar billede dj Nybegynder
28. februar 2004 - 15:09 #10
Jeg garanterer ikke for at der ikke er nogle syntaxmæssige fejl i ovenstående kode, jeg har ikke testet det af og VB syntaxen sidder ikke lige i fingerspidserne, bare lige så du er opmærksom på det :)

Men princippet burde være iorden.
Avatar billede jaffafo Nybegynder
28. februar 2004 - 15:35 #11
ser godt ud nu, men virker stadig ikke... :(

BC30451: Name 'Load_Nyhed' is not declared.



Line 44:  <tr>
Line 45:    <td colspan="3" class="TabelIndhold">
Line 46:         <%= Load_Nyhed() %>
Line 47:         <asp:datagrid id="dgVisNyhed" AllowSorting="false" runat="server"></asp:datagrid>
Line 48:     </td>
________________________________________________________


men jeg har Dim'et den som en string...
Avatar billede jaffafo Nybegynder
28. februar 2004 - 15:44 #12
jeg kom videre..  nu får jeg denne fejl.. :S

System.NullReferenceException: Object reference not set to an instance of an object. at ASP.visnyhed_ascx.Load_Nyhed() in D:\Projects\Heimasíður\Á veg\Tomo.dk\Tomo.dk v1.0\sider\visnyhed.ascx:line 27
Avatar billede dj Nybegynder
28. februar 2004 - 17:43 #13
Det ville nok hjælpe hvis du pastede linie 27 :)

Anyway, såfremt det drejer sig om denne linie:

result = OXmlNode.InnerText

Så skyldes det formentlig at din XPATH expression ikke returnerer noget objekt, den er btw. også forkert kan jeg se da du skal skrive [@NyhedsID=... og ikke bare [NyhedsID=... for at få fat på attributten.

Desuden kan du btw. godt fjerne de her 2 erklæringer fra din metode:

    Dim Nyhed as XmlNode
    Dim nodeList as XmlNodeList

Dem havde jeg lige overset, de bruges ikke til noget i den metode.
Avatar billede jaffafo Nybegynder
28. februar 2004 - 19:23 #14
Samme problem...  :(  i denne linje:

result = Nyhed.InnerText


Koden er her:

    Dim xmlfilnavn as string = server.MapPath("xml/nyheder.xml")
    Dim objXMLdoc As New XmlDocument()
    Dim result as string   
   
    try
       
        objXMLdoc.Load(xmlfilnavn)
           
        Dim root as XmlNode = objXMLdoc.DocumentElement
        Dim strNyhedid as string = request.QueryString("Nyhedid")
        Dim Nyhed as XmlNode = root.SelectSingleNode("descendant::Nyhed[@NyhedID='" & strNyhedid & "']")
        result = Nyhed.InnerText
Avatar billede jaffafo Nybegynder
28. februar 2004 - 19:24 #15
Min XML ser sådan ud:

<?xml version="1.0" encoding="iso-8859-1" ?>
<nyheder>
    <nyhed>
        <nyhedid>1</nyhedid>
        <overskrift>Siden oppe!</overskrift>
        <tekst>Ja så er siden oppe igen...</tekst>
        <dato>19-02-04</dato>
    </nyhed>
    <nyhed>
        <nyhedid>2</nyhedid>
        <overskrift>Siden oppe IGENIGENIGENIGENIGEN!</overskrift>
        <tekst>Ja så er siden oppe igen.asdasdasd..</tekst>
        <dato>20-02-04</dato>
    </nyhed>
</nyheder>
Avatar billede dj Nybegynder
28. februar 2004 - 19:39 #16
Se så er det jo ikke så underligt :)

Den nemme måde at få det til at virke på er ved at formatere din XML til følgende:

<?xml version="1.0" encoding="iso-8859-1" ?>
<nyheder>
    <nyhed NyhedsID="1">
        <overskrift>Siden oppe!</overskrift>
        <tekst>Ja så er siden oppe igen...</tekst>
        <dato>19-02-04</dato>
    <nNyhed>
    <Nyhed NyhedsID="2">
        <overskrift>Siden oppe IGENIGENIGENIGENIGEN!</overskrift>
        <tekst>Ja så er siden oppe igen.asdasdasd..</tekst>
        <dato>20-02-04</dato>
    </nyhed>
</nyheder>

Bemærk også at XML er Casesenstivit, det er altså ikke ligegyldigt om du bruger store eller små bogstaver i din XPATH expression.

Følgende burde være korrekt:

Dim objXMLdoc As New XmlDocument()
Dim strNyhedid as string = request.QueryString("Nyhedid")
Dim Nyhed as XmlNode = objXMLdoc.SelectSingleNode("//nyheder/nyhed[@NyhedsID='" & strNyhedid & "']")
result = Nyhed.InnerText
Avatar billede jaffafo Nybegynder
28. februar 2004 - 20:28 #17
Jeg takker mange gange..  nu virker det som det skal..  :-)

du får points..

lige et lille spørgsmål til:  hvis jeg nu skal skrive til en XML fil  hvordan får jeg den til at skrive det på den måde, med nyhedid som et parameter og hvordan kan jeg sikre at den altid giver et unikt id?
Avatar billede dj Nybegynder
28. februar 2004 - 21:39 #18
Selv tak.

For at generere en XML fil anvendes nogle af de samme klasser som du allerede har stiftet bekendtskab med. Nemlig XmlDocument og XmlNode og til håndtering af attributter (f.eks. NyhedsID) benyttes XmlAttribute.
Prøv at slå dem op i .NET dokumentationen, der skulle være rigeligt med eksempler der kan hjælpe dig på vej.

Der er flere måder at lave et unikt ID på, f.eks. kan du gennemløbe alle nyheder og så finde ud af hvad det højeste ID er og tælle det 1 op. Du kan også benytte et GUID som er en del af frameworket. Det er en 128bit identifier der er helt og aldeles unik, den benyttes ved at kalde Guid.NewGuid(); Det ser dog ikke helt så pænt ud med en 128bit parameter i en url, så førstnævnte løsning er nok at foretrække i det her tilfælde :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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