Načítání XML souboru   zodpovězená otázka

VB.NET, Algoritmy, XML, I/O operace

Ahoj, mám Xml soubor, do kterého ukládám a načítám z něj obsah Listview, nebo aspoň bych chtěl... soubor má takovou strukturu:

<?xml version="1.0"?>
<data>
  <item id="001" date="15.3.2008" text="asdasdsdfdsf" />
  <item id="002" date="8.10.2008" text="ghgfghdfhgdf" />
  <item id="003" date="14.8.2008" text="hjghjghjhgjghj" />
</data>

soubor se mi načte do proměnné(XmlDocument), a já jsem z něj chtěl číst tímhle způsobem (podle článku Tomáš Hercega):

    For Each n As Xml.XmlNode In doc.SelectNodes("/data/item")
        Dim id As Integer = CInt(n.Attributes("id").Value)
        Dim dat As Date = CDate(n.Attributes("date").Value)
        Dim text As String = n.Attributes("id").Value
    Next

problém je v tom, že se dostanu do nekonečného cyklu a nevím proč...

poraďte co dělám špatně

děkuju

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém bude podle mě v něčem jiném, kód, který jste poslal, věčný cyklus nezapříčiní. Pošlete sem celé načítání souboru, tohle je v pořádku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Všechno co se týká Xml (načítání, ukládání...) jsem zapouzdřil do třídy. Ta vipadá nějak takhle:

Imports System.Xml

Public Class Database
    Private doc As New XmlDocument()

    Public Sub New()
        doc = New XmlDocument
    End Sub

    Public Sub New(ByVal Path As String)
        doc = New XmlDocument
        doc.Load(Path)
    End Sub

    Public Function GetItems() As ListViewItem()
        Dim array As New List(Of ListViewItem)
        For Each n As Xml.XmlNode In doc.SelectNodes("/reminders/reminder")
            Dim id As String = n.Attributes("id").Value
            Dim dat As String = n.Attributes("date").Value
            Dim text As String = n.Attributes("text").Value

            Dim item As New ListViewItem(id)
            item.SubItems.Add(dat)
            item.SubItems.Add(text)

            Debug.Print(item.Text)

            array.Add(item)
        Next

        GetItems = array.ToArray

        Return GetItems()
    End Function
End Class

Načítání souboru do ListView volám takhle

        Dim DB As New Database("C:\data.xml")

        ListView1.Items.AddRange(DB.GetReminders)

právě funkce GetItems se mi dostává do věčného cyklu, ale ne vždycky... když vynechám kontrolní výpis Debug.Print(item.Text) tak mi to hned v hlavičce for each cyklu (nebo někdy taky na next) vyhodí tuhle chybu An unhandled exception of type 'System.StackOverflowException' occurred in System.Xml.dll

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No protože blbě vracíte výsledek. Hodnota funkce se ve VB.NET dá vrátit dvěma způsoby:

1. Přiřazení do názvu funkce

GetItems = array.ToArray()

Jakmile funkce doběhne na konec, použije se přiřazená hodnota jako výsledek.

2. Klíčové slovo Return

Return array.ToArray()

Tím se funkce ihned ukončí a vrátí daný výsledek.

Vy máte chybu v tom, že jednak se používá buď Return, nebo přiřazení, ale ne obě dohromady. Když přiřazujete do názvu funkce, tak pozor - nechová se to jako proměnná, nemůžete přiřazenou hodnotu zase přečíst. Tím totiž tu funkci jednoduše zavoláte.

Potíž je v tom, že když napíšete Return GetItems(), tak se funkce GetItems() zavolá znovu a její výsledek se teprve dosadí za to volání. A to je ten věčný cyklus, funkce se volají a volají pořád dál a dál.

Správně je to tedy takhle:

        ...
        Next
        
        Return array.ToArray()
    End Function
End Class
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jéé děkuju už to funguje. Hned jsem zase o něco chytřejší

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Už na první pohled vidím hovadinu:

        GetItems = array.ToArray

        Return GetItems()

Mimochodem proč funkce nevrací List(Of ListViewItem) ale pole, kvůli kterému to musíte z toho listu ještě zkopírovat? Úžasně neefektivní kód.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

díky za postřehy

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback