[ lopkiju @ 23.10.2006. 02:45 ] @
Elem, XML fajl izgleda ovako:

Code:

<Root>
    <Application>
        <Form Name="Form1">
            <Module BoundToID="1" Namespace="SmallControls.TitlePanel" Position="Left" />
            <Module BoundToID="1" Namespace="SmallControls.FileBrowse" Position="Left" />
        </Form>
    </Application>
    <ModuleList>
        <Module ID="1" Path="SmallControls.dll" />
    </ModuleList>
</Root>


Ono sto ja zelim jeste da selektujem samo one nodove kojima je Form Name = Form1, tj. ova dva koja jedina i postoje trenutno.

Ovo je taj XPath query koji to postize:

Code:
/Root/Application/Form[@Name='Form1']/node()


Takav isti code mi fenomenalno obavlja posao u nekoj drugoj aplikaciji.

Problem ovde je sto kada pokrenem ovo, ovaj code dole mi vrati samo jedan jedini zapis i to onaj koji je prvi...

Code:
while (node.MoveNext())
{
    MessageBox.Show(node.Current.GetAttribute("Namespace", ""));
}


Zasto se tako ludo ponasa, ili sam ja taj koji ludim?
[ jablan @ 23.10.2006. 08:33 ] @
Probaj
Code:

/Root/Application/Form[@Name='Form1']/*
[ lopkiju @ 23.10.2006. 12:00 ] @
Ne radi. Isto se ponasa kao i sa node().
[ jablan @ 23.10.2006. 12:08 ] @
Kako puniš promenljivu node? Šta ti je ona?
[ lopkiju @ 23.10.2006. 12:19 ] @
Code:
nav = doc.CreateNavigator();
node = lng.nav.Select("/Root/Application/Form[@Name='Form1']/*");


node je XPathNodeIterator.
nav je XPathNavigator.
[ lopkiju @ 23.10.2006. 17:07 ] @
Recite mi samo nesto.

Da li su uredu ova dva code-a?

Code:

            string position;
            string path;
            string name;

            Assembly ass;
            Type t;
            UserControl uc;
            Object o;
            int[] visina;

            lng.nav = lng.doc.CreateNavigator();
            lng.node = lng.nav.Select("/Root/Application/Module[@Form='Form1' or @Form='']");

            while (lng.node.MoveNext())
            {
                name = lng.node.Current.GetAttribute("Namespace", "");
                position = lng.node.Current.GetAttribute("Position", "");
                path = GetModulePath(int.Parse(lng.node.Current.GetAttribute("BoundToID", "").ToString()));

                ass = Assembly.LoadFile(Application.StartupPath + "\\" + path);
                t = ass.GetType(name);
                o = Activator.CreateInstance(t);

                uc = ( (UserControl)(o) );
            
                Find(moduleContainer1.panel1, position).Controls.Add(uc);

                visina = new int[2]; // Velicina niza zavisi od broja panela u ModuleContainer UCu.
            
                for (int i = 0; i <= moduleContainer1.panel1.Controls.Count -1; i++)
                {
                    foreach (UserControl c in moduleContainer1.panel1.Controls[i].Controls)
                    {
                        visina[i] += c.Height;
                    }
                }

                int j = 0;
                foreach (Panel pnl in moduleContainer1.panel1.Controls)
                {
                    pnl.Height = visina[j];
                    j++;
                }
            }


i ovaj

Code:

        public string GetModulePath(int id)
        {
            lng.nav = lng.doc.CreateNavigator();
            lng.node = lng.nav.Select("/YuGit/ModuleList/Module[@ID=" + id + "]");

            lng.node.MoveNext();

            return lng.node.Current.GetAttribute("Path", "");
        }


Stim sto sam morao da promenim organizaciju xml fajlu i sada xml fajl izgleda ovako:

Code:

<?xml version="1.0" encoding="utf-8" ?>
<YuGit>
    <Application>
        <Module Form="Form1" BoundToID="1" Namespace="SmallControls.TitlePanel" Position="Left" />
        <Module Form="Form1" BoundToID="1" Namespace="SmallControls.FileBrowse" Position="Left" />
    </Application>
    <ModuleList>
        <Module ID="1" Path="SmallControls.dll" />
    </ModuleList>
</YuGit>


Lng je instanca klase u kojoj se nalaze methode za manupulisanje xml fajlovima.

Samo mi recite da li su ova dva code-a uredu u odnosu na ovaj xml fajl, i da li bi trebali da rade?
[ jablan @ 23.10.2006. 21:33 ] @
Meni izgledaju ok, osim što ti je u prvom kodu root element pogrešan (Root umesto YuGit). Inače, ja nisam radio sa Navigator i NodeIterator klasama, kad treba da izvučem neki nodeset i iteriram kroz njega, koristim XmlDocument.SelectNodes metodu.

Poz.

PS Nadam se da ti YuGit nije naziv programa... ;)
[ lopkiju @ 23.10.2006. 22:06 ] @
E vidis, sto je najgore, i meni code izgleda sasvim normalno, ali iako sam promenio organizaciju xml fajla kao i code koji treba da cita xml fajl, i dalje mi vraca samo prvi zapis.
Pre nego sto sam pitao da li valja code, nasao sam krivca za ovu nelogicnost.

Funkcija GetModulePath pravi probleme, kada komentiram liniju u kojoj se poziva f-ja, sve radi kako i treba da radi.
E sad, zasto se tako ponasa, ja nemam blage veze.

Da, to za YuGit i Root sam ja nesto menjao, ali sam xpath query prilagodio promenama - naravno :).

Sta fali YuGit-u :D?
A ne znam jos kako se zove program (to cemo sa kolegama developerima da se konsultujemo :)), sigurno ce imati veze sa YuGit-om (sa eventualno nekim dodacima) jer je program za njih, a tako se zove ta firma :).

Inace, hvala.
Da nisam ovde nesto napisao, ne verujem da bih pronasao krivca :).

Jos samo da vidim sta ne valja sa ovom f-jom...
[ jablan @ 23.10.2006. 22:25 ] @
Probaj da dodaš apostrofe oko vrednosti ID-ja:
Code:

lng.node = lng.nav.Select("/YuGit/ModuleList/Module[@ID='" + id + "']");

Ja zato volim da koristim metodu String.Format:
Code:

lng.node = lng.nav.Select(String.Format("/YuGit/ModuleList/Module[@ID='{0}']", id));


Što se imena tiče, konsultuj engleski rečnik za reč Git
[ lopkiju @ 23.10.2006. 22:57 ] @
Ne vrede ni apostrofi ni String.Format...
Usko grlo je upravo f-ja. Ako je komentarisem, onda radi i bez apostrofa i sa njima i sa String.Format, cim je od komentarisem, eto problema.
Ne znam koji joj je...

A za Git, znam iz Mucki :), ali sta da radim kada se tako zove firma :).
[ jablan @ 24.10.2006. 08:25 ] @
Pa jesi li probao da debagiraš red po red?
[ lopkiju @ 24.10.2006. 14:36 ] @
Naravno da sam radio debug.

Udje u f-ju, vrati mi putanju koju treba da vrati, ali while petlja se samo jednom izvrsi.
Kada izbacim tu f-ju sve radi fenomenalno...

Meni nista nije jasno...
[ lopkiju @ 24.10.2006. 15:34 ] @
Nasao sam resenje, tacnije, kolega je nesto uvideo sto ja nisam.

Posto imam klasu koja manipulise sa xml fajlovima (ono lng) ja sam napravio globalnu instancu te klase i tu globalnu instancu klase, koristio za obe f-je.
Resenje je, napraviti jos jednu instancu klase za f-ju koja vraca putanju i resen problem...

Eto, koliko problema zbog previda.

Hvala Jablane na vremenu...