[ Shadowed @ 22.05.2007. 01:09 ] @
Imam XML fajl:
Code:

<group>
  <name>BaseGroup</name>
  <vpnname>
  </vpnname>
  <username>
  </username>
  <password>
  </password>
  <path>Remoted</path>
  <groups>
    <group>
      <name>group1</name>
      <vpnname>
      </vpnname>
      <username>
      </username>
      <password>
      </password>
      <path>Remoted\group1</path>
      <groups>
        <group>
          <name>group1-1</name>
          <vpnname>
          </vpnname>
          <username>
          </username>
          <password>
          </password>
          <path>Remoted\group1\group1-1</path>
        </group>
      </groups>
      <servers>
        <server>
          <name>server1-1</name>
          <hostname>serverbla</hostname>
        </server>
      </servers>
    </group>
    <group>
      <name>group2</name>
      <vpnname>
      </vpnname>
      <username>
      </username>
      <password>
      </password>
      <path>Remoted\server2</path>
    </group>
  </groups>
</group>


Me.Name = data.SelectNodes("/group/name")(0).InnerText radi normalno, tj. nalazi "BaseGroup"
Dim GroupNodes As XmlNodeList = data.SelectNodes("/group/gourps/group") vraca praznu listu.

Da li nesto previdjam ili... ?

[Ovu poruku je menjao Shadowed dana 22.05.2007. u 02:38 GMT+1]
[ spartak @ 22.05.2007. 08:15 ] @
Mozda zato sto ti u tag pise gROUps a ti ga trazis sa gOURps
[ Shadowed @ 22.05.2007. 12:17 ] @
Znaci, ne verujem... 10 puta sam gledao da nisam pogresno napisao...
[ Shadowed @ 22.05.2007. 15:34 ] @
Hm, sad imam nov problem...
Code:

Public Sub RestoreFromXML(ByVal data As XmlNode)
    With data
...
    Dim GroupNodes As XmlNodeList = .SelectNodes("/group/groups/group")
        If GroupNodes.Count > 0 Then
            For Each GroupNode As XmlNode In GroupNodes
                Dim tmpGroup As New Group
                tmpGroup.RestoreFromXML(GroupNode)
                Me.ChildGroups.Add(tmpGroup)
            Next
        End If
    End With
End Sub

Ovo je rekurzivna funkcija koja bi trebala da kreira stablo grupa i servera (ovo za servere sam izbacio, ovde je nebitno). Nalazi se kao metod u klasi Group.
Problem je u tome sto uvek dobijam istu GroupNodes listu i samim tim se rekurzija izvrsava sve dok ne prepuni stack.
[ Shadowed @ 22.05.2007. 17:00 ] @
Malo dodatnih podataka.
Stavio sam brakepoint i prilikom prvog prolaska GroupNode ima XML koji i treba:
Code:

<group>
      <name>group1</name>
      <vpnname>
      </vpnname>
      <username>
      </username>
      <password>
      </password>
      <path>Remoted\group1</path>
      <groups>
        <group>
          <name>group1-1</name>
          <vpnname>
          </vpnname>
          <username>
          </username>
          <password>
          </password>
          <path>Remoted\group1\group1-1</path>
        </group>
      </groups>
      <servers>
        <server>
          <name>server1-1</name>
          <hostname>serverbla</hostname>
        </server>
      </servers>
    </group>


Medjutim, kada se ponovo pozove funkcija sa ovim Node-om, prilikom selekcije sa "/group/groups/group" umesto da dobijem jedan node koji imas xml:
Code:
<group>
          <name>group1-1</name>
          <vpnname>
          </vpnname>
          <username>
          </username>
          <password>
          </password>
          <path>Remoted\group1\group1-1</path>
        </group>

ja dobijem listu od dva node-a od kojih prvi ima isti onaj gore xml.
Najcudnije mi je sto u provom prolazu radi, u drugom ne.
[ mmix @ 22.05.2007. 18:32 ] @
Xpath ti pocinje sa / sto vuce na root. XPath se uvek primenjuje na trenutni node u okviru celog stabla, narodski iako trazis XPath nad nodom, sam path je u "apsolutnom" modu i uvek vraca isto... Probaj sa relativnom XPath putanjom "groups/group" u rekurziji..

[ Shadowed @ 22.05.2007. 19:52 ] @
Ako stavim "groups/group" ne dobijam ni jedan, sto mi je i logicno, jer root element je group pa mora krenuti od njega. Ako stavim "group/groups/group", znaci isto kao na pocetku samo kao relativno putanju, u prvom krugu dobijem dva node-a, kao i sa apsolutnom putanjom, dok u drugom kada se prosledi samo unutrasnji deo (xml za podgrupu), ne vrati ni jedan (iako postoji ova "group1-1" grupa.
Sve ovo mi izgleda totalno uvrnuto. A i mislim da ne bi trebalo da bude razlike izmedju apsolutne i relativne putanje ovde jer prilikom novog poziva funkcije, dobija se samo unutrasnji deo xml-a i kada se on gleda, apsolutna putanja je taman kako treba.

Inace, ako iko ima ideju kako ovo da se uradi na drugi nacin, dobrodoslo je. Bitno mi je jedino da bude obican fajl a ne baza i pozeljno je da je xml.
[ mmix @ 22.05.2007. 20:31 ] @
Ok, onda izvuci /group node i pozovi rekurziju nad njim specificirajuci /groups/group kao xpath u rekurziji...

XmlDocument nije jednako <group> nodu, vec je korak iznad njega.
[ Shadowed @ 22.05.2007. 21:26 ] @
Sa "/groups/group/" je GroupNodes.Count = 0 :/
[ Shadowed @ 23.05.2007. 10:31 ] @
Odustadoh od ovog nacina. Probao sam XMLSerializer i radi sasvim zadovoljavajuce, cak daje godovo isti XML kao ovaj koji sam ja koristio. Ostale podatke cu staviti u drugi fajl iako sam se nadao da imam samo jedan config fajl.
Bar sam naucio jednu stvar - da je XPath ipak komplikovaniji nego sto izgleda :)

Hvala, spartak i mmix.
[ mmix @ 23.05.2007. 15:12 ] @
Ok, nesto se mi nismo bili razumeli, sad sam proverio i definitivno je u pitanju absolue vs relative path (prepevah tvoj sample u C#):

Code:

    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("data.xml");

            Group g = new Group();
            g.RestoreFromXML(doc.DocumentElement);

        }
    }

    public class Group
    {
        Collection<Group> ChildGroups = new Collection<Group>();
        public void RestoreFromXML(XmlNode data)
        {
            XmlNodeList GroupNodes = data.SelectNodes("groups/group");

            if (GroupNodes.Count > 0)
                foreach (XmlNode GroupNode in GroupNodes)
                {
                    Group tmpGroup = new Group();
                    tmpGroup.RestoreFromXML(GroupNode);
                    this.ChildGroups.Add(tmpGroup);
                }
        }

    }


i ovo radi sasvim ok, sto se vidi iz prilozene slike

[att_img]

I ja bih ti licno predlozio da koristis XML serijalizaciju za ove stvari (i to te ne spracava stvais sta god hoces u jedan config file), ali XPath definitivno jeste jednostavan