XML SelectSingleNode bez rekurze

Giovanna

XML SelectSingleNode bez rekurze
« kdy: 19. 04. 2015, 18:12:56 »
Dobry den, mam vlastní objektovou nastavbu nad konfiguracnim souborem, který obsahuje root, rodice, deti, hodnotove elementy atd. Chtel jsem se pridrzet alespoň trochu implementaci podle DOM, proto jsem chtěl podle xpath najit element odpovídající tomuto vyrazu. Proto mam:

Kód: [Vybrat]
            public CfgNode SelectValueNode(CfgNode cfgNode, string nodePath, int indexInPath)
            {
                CfgNode retNode = null;

                string nodeInPath = string.Empty;

                char[] nodesSeparator = {'/'};

                string[] nodesNames = nodePath.Split(nodesSeparator);

                if (nodesNames.Length > indexInPath)
                {
                    nodeInPath = nodesNames[indexInPath];
                }

                if (cfgNode.HasChildren)
                {
                    foreach (CfgNode childNode in cfgNode.ChildNodes)
                    {
                        if ((childNode.nodeName != string.Empty) && (childNode.nodeName == nodeInPath))
                        {
                            Console.WriteLine(childNode.nodeName);

                            retNode = SelectValueNode(childNode, nodePath, indexInPath + 1);

                        }
                    }
                }

                return retNode;
            }

Jenze rekurze to nevyresila(zda se mi) - pral jsem si, aby mi byl vracen pozadovany element - tedy ten na konci xpath cesty za posledním lomítkem. Jenze jsem se v tom ztratil a ted uz si ani nejsem jisty, zda-li rekurze byla dobrym napadem.

Proto jsem se vas chtěl zeptat, zda-li jset to uz resili a jak? Dekuji
« Poslední změna: 19. 04. 2015, 23:17:17 od Petr Krčmář »


jilekjedebil

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #1 kdy: 19. 04. 2015, 19:11:22 »
A jak bys to chtěl řešit??? Modlenim se k bohu??? Prostě musíš projít strom. A to bez cyklu nejde. A je jedno jestli použiješ iterační či rekurzivni variantu. S rekurzi to budeš mít lehčí.

Giovanna

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #2 kdy: 19. 04. 2015, 20:14:25 »
Já ale vím, že to celé musím projít i že mám minimálně možnost rekurze. Ale teď nevím jak vrátit a uložit návratovou hodnotu z posledního volání SelectValueNode z rekurze. Nebo to mám dobře a jen někde drobná chybka? Děkuji

P.S. Kdybych to byl ochotný řešit prasácky, tak si nalezený element uložím do statické proměnné typu CfgNode a rekurze už nějak doběhne.

zdfasdfasdfas

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #3 kdy: 19. 04. 2015, 20:34:13 »
1) rekurze je dobry nastroj
2) prehnane pouzivani statickych promennych v OOP je spatne

Kit

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #4 kdy: 19. 04. 2015, 20:38:03 »
Já ale vím, že to celé musím projít i že mám minimálně možnost rekurze. Ale teď nevím jak vrátit a uložit návratovou hodnotu z posledního volání SelectValueNode z rekurze.

Returnem...


andy

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #5 kdy: 19. 04. 2015, 20:56:54 »
Skus si najprv implementovat fibonaciho alebo nieco lahsie. :-X (a ano da sa to aj bez rekurze)

wamba

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #6 kdy: 19. 04. 2015, 21:31:14 »
(v Javě se nevyznám, jestli je to vůbec Java :))
ale já bych první v třídě cfgNode implementoval metodu childByName
a pak napsal něco jako (pseudokód)
Kód: [Vybrat]
foreach name in nodeNames{
    if not(childNode.childByName(name)) {return};
    childNode=childNode.childByName(name)
}
return childNode

Kit

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #7 kdy: 19. 04. 2015, 21:44:39 »
Pořád mi není jasné: Proč nepoužiješ XPath? Nebudeš potřebovat ani rekurzi, ani cyklus.

DK

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #8 kdy: 19. 04. 2015, 21:50:59 »
(v Javě se nevyznám, jestli je to vůbec Java :))
ale já bych první v třídě cfgNode implementoval metodu childByName
a pak napsal něco jako (pseudokód)
Kód: [Vybrat]
foreach name in nodeNames{
    if not(childNode.childByName(name)) {return};
    childNode=childNode.childByName(name)
}
return childNode
To spis vypada na C#, Java to neni urcite

wamba

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #9 kdy: 19. 04. 2015, 21:56:15 »
To spis vypada na C#, Java to neni urcite
beru na vědomí. já jen poznal, že to není Perl  :)

Kit

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #10 kdy: 19. 04. 2015, 21:59:19 »
To spis vypada na C#, Java to neni urcite

Podle přiblblého zápisu ob řádek bych také tipl C#.

lobo

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #11 kdy: 19. 04. 2015, 23:30:24 »
To spis vypada na C#, Java to neni urcite

Podle přiblblého zápisu ob řádek bych také tipl C#.
co ma preboha ob radek spolocneho s C# ?

Giovanna

Re:XML SelectSingleNode bez rekurze
« Odpověď #12 kdy: 19. 04. 2015, 23:59:27 »
Je to C#, akorát v tom foreach po nalezeni node mi chybi break. a dodělat logiku.

Udelam si tam trasovani, zítra je taky den. Asi za 4 minuty.:-)

Diky
Honza

Giovanna

Re:XML SelectSingleNode bez rekurze? Lze to?
« Odpověď #13 kdy: 20. 04. 2015, 00:11:35 »
Pořád mi není jasné: Proč nepoužiješ XPath? Nebudeš potřebovat ani rekurzi, ani cyklus.

Protože implementuju vlastní formát souboru, který není zcela kompatibilní s XML.

Giovanna

Re:XML SelectSingleNode bez rekurze
« Odpověď #14 kdy: 20. 04. 2015, 00:28:51 »
malá úprava a kód funguje, jen na začátek metody patří:

Kód: [Vybrat]
CfgNode retNode = cfgNode;

Předtím jsem tam dosazoval null.

Diky vsem.