XPath - jak to przyspieszyć?

0

Pracuję na dość dużych xmlach. W jednym punkcie przetwarzanie mam niesamowite spowolnienie:

                XmlNode section = xml.SelectSingleNode("//section[body//div[@name='" + this.name + "']]");
                if (section != null)
                {
                    this.section_name = section.Attributes["name"].Value;
                }

xml to XmlDocument.

Poprzednio kod ten wyglądał tak (był to błąd):

                XmlNode section = xml.SelectSingleNode("//section[body/div[@name='" + this.name + "']]");
                if (section != null)
                {
                    this.section_name = section.Attributes["name"].Value;
                }

I działał 100x szybciej.
Drobna zmiana w xpathie, spowolnienie do przeżycia.

Nie wiem czy to widać co to robi, chodzi w sumie o to, że mamy section'y, a sectionach mamy divy. Zarówno div i section ma body, w którym mogą być kolejne divy, coraz głębiej zagnieżdżone. Sectiony nigdy nie występują w divach.
To co chcemy uzyskać, to dla każdego diva w xml'u pobrać atrybut "name" z jego najbliższego rodzica o nazwie section.

W JS (MooTools) to napisałabym to prosto: this.section_name = this.div.Parent("section").Attributes("name");
Ale to nie JS :/

Czy macie jakieś sugestie, jak najszybciej odczytać wartość atrybutu pierwszego rodzica danego węzła? Bo mój sposób ewidentnie jest do bani ;)
Mogłabym niby zrobić pętlę po parentach i sprawdząć po kolei... ale czy to aby będzie szybciej...?

3

Wygląda na to, że prosty kodzik:

public static XmlNode GetParent(XmlNode node, string parent_name)
        {
            if (parent_name == "")
                return node.ParentNode;

            if (node.ParentNode == null)
                return null;

            if (node.ParentNode.Name == parent_name)
                return node.ParentNode;
            else
            {
                node = node.ParentNode;
                return GetParent(node, parent_name);
            }
        } 

Rozwiązuje problem i daje przyzwoity czas.
Dam sobie plusika ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1