CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Xml Child Nodes

Xml Child Nodes

dział ogólny

Xml Child Nodes

Nowy postprzez Slynx » środa, 8 czerwca 2011, 20:13

Kod: Zaznacz cały
<parentx>
    <parenty>
      <zzz1>xxx</zzz1>
      <zzz2>yyy</zzz2>
      <zzz3>zzz</zzz3>
      <zzz4 /> // to też jest wartość
    </parenty>
</parentx>

I chcę pobrać wartości <parenty> zakładając, że poszczególne elementy <parenty> mogą zawierać puste elementy oraz że nie znamy głębokości na jakiej znajduje się <parenty>

Kombinowałem na kilka sposobów, ale kod zaczął się dziwnie rozrastać, bo żeby wydobyć niektóre elementy trzeba było tworzyć nowe obiekty, ustawiać właściwości, itp.
Aha i dokument jest wczytany do obiektu klasy XmlReader. Będę wdzięczny za jakieś proste rozwiązanie.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Xml Child Nodes

Nowy postprzez Cyfrowy Baron » środa, 8 czerwca 2011, 20:40

Podobny problem był poruszany w tym wątku: http://programowanie.cal.pl/forum/viewtopic.php?f=2&t=1145&p=7877&hilitl#p7877
W C++Builder niestety nie ma biblioteki XMLReader.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Xml Child Nodes

Nowy postprzez Slynx » środa, 8 czerwca 2011, 20:50

No tak, ale zapisywanie, a odczytywanie to dwie różne rzeczy : / Poza tym, metody z klas się nie pokrywają, więc...
coś kombinuje, jak mi się uda to dam znać, a do tego czasu temat aktualny.
---
Na razie wykombinowałem sobie coś takiego
KOD cpp:     UKRYJ  
        array<String^> ^ XML_Get_Elements(String^ node)
                {
                        XmlReader ^ reader = XmlReader::Create("c://settings.xml");
                        System::Collections::Queue ^ s = gcnew Queue();
                        if (reader->ReadToFollowing(node) == true)
                        {
                                Xml::XmlReader ^ x = reader->ReadSubtree();
                                while ((x->NodeType ==  XmlNodeType::Element) && (!x->Name->Equals(node)))
                                {
                                        x->Read();
                                        s->Enqueue(reader->ReadString());
                                }
                                array<String^> ^ temp = gcnew array<String^>(s->Count);
                                for each(String ^%st in temp)
                                {
                                        st = (String^)s->Dequeue();
                                }
                                return temp;
                        }
                        else
                        {
                                return nullptr;
                        }                      
                }
 


Ale to nie działa poprawnie :/

----
Zrobiłem ;)
Gdyby ktoś był zainteresowany to poprawiony kod wygląda tak:
KOD cpp:     UKRYJ  
                array<String^> ^ XML_Get_Elements(String^ node)
                {
                        XmlReader ^ reader = XmlReader::Create("c://settings.xml"); // tylko tymczasowo
                        System::Collections::Queue ^ s = gcnew Queue();
                        if (reader->ReadToFollowing(node) == true)
                        {
                                Xml::XmlReader ^ x = reader->ReadSubtree();
                                while (x->Name != node)
                                {
                                        x->Read();
                                       
                                        if (reader->NodeType == XmlNodeType::Text)
                                        {
                                                s->Enqueue(reader->ReadString());
                                        }
                                        else
                                        {
                                                reader->ReadString();
                                        }
                                }
                                array<String^> ^ temp = gcnew array<String^>(s->Count);
                                for each(String ^%st in temp)
                                {
                                        st = (String^)s->Dequeue();
                                }
                                return temp;
                        }
                        else
                        {
                                return nullptr;
                        }                      
                }
 
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości