CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z Plikiem XML

Problem z Plikiem XML

dział ogólny

Problem z Plikiem XML

Nowy postprzez Knopers » czwartek, 29 lipca 2010, 16:35

Witam .
Chciałem wczytać pewną informację z pliku xml, lecz wywala mi komunikat "Element does not contain a single text node".
Plik xml wygląda tak:
Kod: Zaznacz cały
<?xml version="1.0" ?>
<gfile>
<status>ok</status>
<file>
<file_prop>
<key>00QQmiI7u3s</key>
</file_prop>
</file>
</gfile>


Kod którym próbuje go wczytać
status mi zwraca a key już nie

KOD cpp:     UKRYJ  
 XMLDocument1->LoadFromFile("c:\\tempfile.xml");

 XMLDocument1->Active = true;

 Edit3->Text = "Status: " + XMLDocument1->DocumentElement->ChildNodes->FindNode("status")->NodeValue;

 Edit2->Text = XMLDocument1->DocumentElement->ChildNodes->FindNode("file")->ChildNodes->FindNode("file_prop")->
                     ChildNodes->FindNode("key")->NodeValue;
 
Proszę o szybką pomoc, z góry dziękuję .
Pozdrawiam Knopers
Avatar użytkownika
Knopers
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): czwartek, 29 lipca 2010, 16:16
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 09:46

Przetestowałem Twój kod z Twoim plikiem XML i u mnie działa to prawidłowo, więc błędu nie może wywoływać podany przez Ciebie kod. Przetestowałem z różnymi ustawieniami właściwości komponentu TXMLDocument i nie wystąpiły żadne błędy. Być może problemem jest fakt, że używasz starej wersji C++Builder 2006 i to biblioteka zawiera jakieś błędy.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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: Problem z Plikiem XML

Nowy postprzez Knopers » piątek, 30 lipca 2010, 10:52

Bardzo przepraszam pomyliłem kody
xml do wczytania
Kod: Zaznacz cały
<?xml version="1.0" ?>
<response>
<msg></msg>
<status>ok</status>
<file>
<key>7XZKo8AF3oP</key>
<name></name>
<filename></filename>
<owner>
<login></login>
<avatarId></avatarId>
<avatarSmallId></avatarSmallId>
<avatarMiddleId></avatarMiddleId>
<country></country>
</owner>
<directory></directory>
<size></size>
<timestamp></timestamp>
<modified></modified>
<md5></md5>
<mime></mime>
<description></description>
<cmntCnt>
</cmntCnt>
<tags>
</tags>
<categories>
<d0></d0>
</categories>
<next></next>
<prev></prev>
<storeIds>
<fileId><![CDATA[http://jakasstrona.pl/jakisskod/plik.php?get=1&get=2]]></fileId>
</storeIds>
<IValues>
<duration></duration>
</IValues>
<miniIds>
</miniIds>
<screenIds>
</screenIds>
<SValues>
</SValues>
<isDeleted></isDeleted>
<isPrivate></isPrivate>
<isInPrivateDir></isInPrivateDir>
<isAccepted></isAccepted>
<mayComment></mayComment>
<isAdultsOnly></isAdultsOnly>
<isHidden></isHidden>
<isQueued></isQueued>
<isFeatured></isFeatured>
<isAnonymous></isAnonymous>
<filePageUrl></filePageUrl>
<miniUrl></miniUrl>
<userUrl></userUrl>
</file>
<ads>
<preroll>
</preroll>
<postroll>
<d0>
<type></type>
<url></url>
</d0>
</postroll>
</ads>
</response>

i kody który ro robi i wywala ten błąd to :
Kod: Zaznacz cały
Edit2->Text = XMLDocument1->DocumentElement->ChildNodes->FindNode("file")->ChildNodes->FindNode("storeIds")->ChildNodes->FindNode("fileId")->NodeValue;


PS: tamto faktycznie u mnie działa , jeszcze raz przepraszam za kłopot .
Avatar użytkownika
Knopers
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): czwartek, 29 lipca 2010, 16:16
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 11:28

No nie, ten kod również działa prawidłowo. By nie pozostawiać niedomówień w załączniku testowany plik XML a niżej testowany kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 XMLDocument1->LoadFromFile("c:\\tempfile.xml");

 XMLDocument1->Active = true;

 Edit1->Text = "Status: " + XMLDocument1->DocumentElement->ChildNodes->FindNode("status")->NodeValue;

 Edit2->Text = XMLDocument1->DocumentElement->ChildNodes->FindNode("file")->
               ChildNodes->FindNode("storeIds")->
               ChildNodes->FindNode("fileId")->NodeValue;
}
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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: Problem z Plikiem XML

Nowy postprzez Knopers » piątek, 30 lipca 2010, 11:47

Screen dla pewności : http://img525.imageshack.us/img525/4232/screeneet.jpg

i Pytanie : w jaki inny sposób mogę pobrać ten element ?
Avatar użytkownika
Knopers
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): czwartek, 29 lipca 2010, 16:16
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 12:34

Przede wszystkim na forum można umieszczać obrazki albo poprzez BBCode Img (patrz pasek na górze edytora postu) dodając plik z zewnętrznego serwera, albo też umieszczając grafikę bezpośrednio na serwerze forum poprzez opcję Dodaj załącznik (patrz zakładki na dole edytora postu) a potem umieść w wiadomości.



Co się tyczy zamieszczonego obrazka to nie wnosi on nic nowego do tematu. Jak powiedziałem Twój kod u mnie działa. Na obrazku widać co prawda inny adres w sekcji fileId, ale to nie ma znaczenia o ile plik XML nie zawiera błędów.
W poprzednim poście załączyłem plik XML który testowałem oraz dokładny testowany kod. Być może błąd wywołuje inny fragment kodu, którego tutaj nie zamieściłeś. Zanim więc zaczniesz dalej brnąć w ten temat przeprowadź test. Stwórz nowy projekt, na formularzu umieść komponent XMLDocument1, nic nie zmieniaj w jego właściwościach, umieść komponent Button1 oraz obiekty Edit1 i Edit2. Potem pobierz załączony przeze mnie w poprzednim poście plik XML i posłuż się podanym również w poprzednim moim poście kodem, niczego w nim nie zmieniając. Spróbuj wczytać ten plik XML i napisz jaki był efekt.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 13:01

Szukałem w sieci informacji na ten temat i wszędzie napotyka się ten błąd w starszych wersjach środowiska. Błąd wywołuje wpis: ![CDATA w pliku XML. Poszukam trochę może znajdzie się jakieś rozwiązanie, ale sprawa dla mnie jest o tyle trudna, że u mnie klasa TXMLDocument działa prawidłowo, więc nie mam jak przeprowadzać testów.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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: Problem z Plikiem XML

Nowy postprzez Knopers » piątek, 30 lipca 2010, 13:06

Zrobiłem tak jak napisałeś, powrzucałem nowe komponenty na nową formę, wkleiłem twój kod, ściągnąłem twój plik xml, odpalilem i nadal jest to samo.
http://img265.imageshack.us/img265/3413/screenjjy.jpg

PS: chciałem umieścić obrazek w img oraz załączniku ale "Obrazki mogą mieć maksymalnie 1280 pikseli szerokości." Mój jest większy . ;/

Co do [CDATA plik xml jest generowany przez stronę internetową, niestety ta strona nie należy do mnie więc w żaden sposób nie mogę zmienić zapisu generowanego pliku.
ew. Chyba można wczytać plik xml jako normalny plik, sprawdzać linijka po linijce w poszukiwaniu "[CDATA" i potem usunąć to i normalnie wczytać plik
chyba że jest jakiś inny sposób.
Avatar użytkownika
Knopers
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): czwartek, 29 lipca 2010, 16:16
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 13:19

ew. Chyba można wczytać plik xml jako normalny plik, sprawdzać linijka po linijce w poszukiwaniu "[CDATA" i potem usunąć to i normalnie wczytać plik
chyba że jest jakiś inny sposób.


To nie przejdzie. Ten element musi tam być inaczej nie odczytasz zawartości tego tagu.



Może to błąd w ustawieniach komponentu. Zobacz czy masz ustawione podobnie jak u mnie:

xmldocument.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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: Problem z Plikiem XML

Nowy postprzez Knopers » piątek, 30 lipca 2010, 13:30

Miałem ustawione :
NodeIdentStr na <2 spaces>
i parę wartości w Options na true
Pozmieniałem wszystko na takie jak u ciebie i nadal to samo ;/
Avatar użytkownika
Knopers
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): czwartek, 29 lipca 2010, 16:16
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 13:31

Nie mam dla Ciebie dobrych wiadomości. To BUG środowiska C++Builder 2006:


QC #: Date Reported: 69799 12/11/2008

Description: [QC Short Description]

TXMLNode.CheckTextNode passes DOMNode.nodeName to SNotSingleTextNode but the nodeName does not appear in the error message

[QC Description]
TXMLNode.CheckTextNode passes DOMNode.nodeName to SNotSingleTextNode but the nodeName does not appear in the error message. The reason is that the SNotSingleTextNode format mask does not contain any parameters; the passed nodeName therefore does not end up in the error message.
So SNotSingleTextNode should be changed from SNotSingleTextNode = 'Element does not contain a single text node'; to SNotSingleTextNode = 'Element "%s" does not contain a single text node'; This can be done, as TXMLNode.CheckTextNode is the only place in the VCL where SNotSingleTextNode is used.

QC Entry 69799

Area:
Internet\Controls\TXMLDocument

Steps:
run the code below (it is also in the attachment) expected: EXMLDocError: Element "foo" does not contain a single text node actual: EXMLDocError: Element does not contain a single text node program SNotSingleTextNodeProject; {$APPTYPE CONSOLE} uses ComObj, SysUtils, XMLDoc, XMLIntf; type TLogic = class(TObject) public class procedure Logic; static; end; const SFoo = 'foo'; SBar = 'bar'; class procedure TLogic.Logic; var XmlDocument: IXMLDocument; FooNode: IXMLNode; Bar1Node: IXMLNode; Bar2Node: IXMLNode; FooText: string; begin // setup an XmlDocument of which the root node cannot get provide the Text property XmlDocument := TXMLDocument.Create(nil); XmlDocument.Active := True; FooNode := XmlDocument.AddChild(SFoo); // by adding two elements to the FooNode, FooNode.Text becomes invalid Bar1Node := FooNode.AddChild(SBar); Bar2Node := FooNode.AddChild(SBar); // since FooNode.Text is invalid, an EXMLDocError will be thrown, using SNotSingleTextNode as format mask. // check if that EXMLDocError contains the name of FooNode which is passed by TXMLNode.CheckTextNode FooText := FooNode.Text; end; begin try try // COM needs to be initialized, so: // Manually call InitProc as only WebBroker and Forms do this automatically if InitProc <> nil then TProcedure(InitProc); TLogic.Logic(); // throw the exception except { expected: EXMLDocError: Element "foo" does not contain a single text node actual: EXMLDocError: Element does not contain a single text node TXMLNode.CheckTextNode passes
DOMNode.nodeName to SNotSingleTextNode but the nodeName does not appear in the error message. The reason is that the SNotSingleTextNode format mask does not contain any parameters; the passed nodeName therefore does not end up in the error message. So SNotSingleTextNode should be changed from
SNotSingleTextNode = 'Element does not contain a single text node'; to SNotSingleTextNode = 'Element "%s" does not contain a single text node'; This can be done, as TXMLNode.CheckTextNode is the only place in the VCL where SNotSingleTextNode is used. } on E: Exception do Writeln(E.Classname, ': ', E.Message); end; finally Write('Press the <Enter> key...'); Readln; end; end.



Być może pobranie najnowszej łatki dla środowiska rozwiązuje ten problem

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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: Problem z Plikiem XML

Nowy postprzez Knopers » piątek, 30 lipca 2010, 13:39

mógł byś podać link do tej łatki ?
Avatar użytkownika
Knopers
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): czwartek, 29 lipca 2010, 16:16
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 13:44


Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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: Problem z Plikiem XML

Nowy postprzez polymorphism » piątek, 30 lipca 2010, 13:54

A nie prościej użyć jakiejś zewnętrznej, działającej biblioteki do obsługi XML-a, np. TinyXML?
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Knopers
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z Plikiem XML

Nowy postprzez Cyfrowy Baron » piątek, 30 lipca 2010, 14:02

Na pewno prościej - TinyXML 2.6.1 - to nie jest komponent, ale w archiwum jest kompletna dokumentacja z tutorialem, a biblioteka jest w pełni zgodna z c++.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Knopers
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

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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

cron