[VB] XML import van "active topics" probleem

Pagina: 1
Acties:

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Hallo,

momenteel ben ik aan het werk met het XML importeren van de active topics. Op het moment ben ik nog niet helemaal thuis in XML, maar het gaat de goede kant op! :P

Eigenlijk ben ik meer thuis in het MSHTML gebeuren, zie:

[topic=357342/1/25]

Maar omdat er ook een XML versie bestaat leek het mij beter om die te integreren...

Het probleem echter is dat ik het niet voor elkaar krijg om onderstaande code aan de praat te krijgen...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim XMLDoc        As MSXML.DOMDocument

Public Sub GetGotXML()

Dim sections        As MSXML.IXMLDOMNodeList
Dim root            As MSXML.IXMLDOMNode
Dim childNode        As MSXML.IXMLDOMNode

    Set XMLDoc = New MSXML.DOMDocument
    
    XMLDoc.Load ("http://gathering.tweakers.net/~acm/xml/activetopics.php")
    
    Set root = XMLDoc.documentElement
    
    For Each childNode In root.childNodes
      Debug.Print childNode.Text
    Next
    
End Sub

Weet iemand wat ik fout doe, ik heb al verschillende searches gedaan, maar kom niet op het juiste antwoord!? :?Wellicht iemand die dit ook al eens gedaan heeft met VB!? :9

Ik zie namelijk niet meer wat ik fout doe...

Verwijderd

Op maandag 31 december 2001 14:42 schreef rwoudsma het volgende:
[...]
Het probleem echter is dat ik het niet voor elkaar krijg om onderstaande code aan de praat te krijgen...
[...]
Standaard vraag 1: Wat gaat er dan mis? Krijg je bijvoorbeeld foutmeldingen?

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op maandag 31 december 2001 15:05 schreef MrX het volgende:

[..]

Standaard vraag 1: Wat gaat er dan mis? Krijg je bijvoorbeeld foutmeldingen?
Sorry, foutje |:(

Maar ik krijg de melding:

"Object or With variable not set"

en dat gebeurt in dit stukje:
code:
1
2
3
For Each childNode In root.childNodes
      Debug.Print childNode.Text
Next

Verwijderd

Debuggen is niet echt je sterke kan volgens mij, terwijl het in VB zo simpel is.

XMLDoc.Load geeft een boolean terug die aangeeft of het wel of niet gelukt is het document te laden. In dit geval lukt het dus niet. Daarna kan je met XMLDoc.ParseError.Reason kijken waarom het niet lukt. Ik krijg daar "System does not support the specified encoding."

Kennelijk is er iets mis met het door die pagina geretourneerde XML bestand, want de MSXML slikt hem niet. Ook in IE krijg ik:
The XML page cannot be displayed
Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later.


--------------------------------------------------------------------------------

System does not support the specified encoding. Line 1, Position 45

<?xml version="1.0" encoding="ISO-8859-1" ?>
HTH :)

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op maandag 31 december 2001 15:44 schreef MrX het volgende:
Debuggen is niet echt je sterke kan volgens mij, terwijl het in VB zo simpel is.
Klopt, ben ook niet een hele goede progger... Maar heb alles nu ff goed gedebugged... Kom er alleen niet uit want..
Ik krijg daar "System does not support the specified encoding."

Kennelijk is er iets mis met het door die pagina geretourneerde XML bestand, want de MSXML slikt hem niet.
Bovenstaande foutmelding krijg ik niet!? En ik gebruik hetgeen dan ook binnen Excel 2000 in combinatie met W2K. De foutmelding die ik krijg zijn:

? XMLDoc.parseError.reason
Element content is invalid to the DTD/Schema.
? XMLDoc.parseError.srcText
<last_replier></last_replier>
? XMLDoc.parseError.line
13

Snap er echt niets meer van... Het XML bestand lijkt mij gewoon goed, want jelmervos gebruikt hetzelfde voor:

[topic=356563/1/25]

Weet iemand misschien dan toch het antwoord op mijn probleem...

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Probeer anders deze eens te parsen, daar zit IIRC die lastreplier niet in...

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op woensdag 02 januari 2002 09:36 schreef TheRookie het volgende:
Probeer anders deze eens te parsen, daar zit IIRC die lastreplier niet in...
Heb het geprobeerd, maar daar krijg ik weer een geheel andere melding.

Op het laden geeft hij als boolean true terug, maar als antwoord op

? XMLDoc.parseError.reason
Element content is invalid according to the DTD/Shema.
Expecting fileinfo.

* Woudloper krijgt het gevoel dat deze XML's niet helemaal goed werken, want er zijn geen problemen met het binnenhalen van de turbotracker...

Nog iemand een suggestie...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Het kan zijn dat de DTD nog niet is aangepast door ACM, ACM heeft namelijk last_replier toegevoegd.

Maar dan is het nog vreend, ik maak namelijk gewoon gebruik van de XML parser van MS, MSXML.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

De DTD:
<!ELEMENT activetopics (topic, fileinfo)>
<!ELEMENT topic (id, titel, forum, forumafkorting, tijd, timestamp, topicstarter, replies)>
<!ELEMENT fileinfo (baseurl, timestamp, info)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT titel (#PCDATA)>
<!ELEMENT forum (#PCDATA)>
<!ELEMENT forumafkorting (#PCDATA)>
<!ELEMENT tijd (#PCDATA)>
<!ELEMENT topicstarter (#PCDATA)>
<!ELEMENT replies (#PCDATA)>
<!ELEMENT baseurl (#PCDATA)>
<!ELEMENT timestamp (#PCDATA)>
<!ELEMENT info (#PCDATA)>

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op woensdag 02 januari 2002 09:56 schreef jelmervos het volgende:
[..]

Maar dan is het nog vreend, ik maak namelijk gewoon gebruik van de XML parser van MS, MSXML.
Dat vond ik dus ook zo vreemd! Welke versie van MSXML gebruik jij dan? Ikzelf gebruik version 2.0, maar dat moet toch niet het probleem zijn :?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op woensdag 02 januari 2002 10:10 schreef rwoudsma het volgende:

[..]

Dat vond ik dus ook zo vreemd! Welke versie van MSXML gebruik jij dan? Ikzelf gebruik version 2.0, maar dat moet toch niet het probleem zijn :?
Ik weet niet welke versie, heb IE6 geinstalleerd, maar met IE5 werkt ie ook. Niemand heeft problemen gemeld met de XML parser.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op woensdag 02 januari 2002 10:13 schreef jelmervos het volgende:

[..]

Ik weet niet welke versie, heb IE6 geinstalleerd, maar met IE5 werkt ie ook. Niemand heeft problemen gemeld met de XML parser.
Ik gebruik hier IE versie 5.00.2920.0000, dat moet toch niet het probleem zijn als je het mij vraagt, want je doet gewoon een aanroep naar het XML bestand middels de MSXML...

Jouw code ziet er (hoewel in een andere taal) toch niet erg anders uit??

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Ik snap er dus helemaal niets meer van....

Hier (Rechtermuis, save target as...) is het Excel bestand te downloaden wat ik gemaakt heb...

Daarbinnen heb ik een dropdown box gemaakt welke de turbotracker, activelist 1 en 2 bevat...

Nadat de turbotracker is geselecteerd en je gaat retrieve krijg je één foutmelding. Als je dan gewoon :? debug klikt en dan weer op run gaat alles gewoon weer door..

Bij die andere twee blijf ik problemen houden... Daar werkt die tussenstap niet...

Zou iemand mij kunnen vertellen:

A.Waarom gaat dat fout met die tussenstap? [i]is het dan nog niet geïnitialeerd of zo[/i
B.Wat is er aan de hand met de active topics inlezen.

Hieronder nog een keer de code. De enige reference welke er is, is degene naar het MSXML.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?
Public Sub GetGotXML()
' Sub to retrieve the Active Topics from GOT.
Dim sections            As MSXML.IXMLDOMNodeList
Dim root                As MSXML.IXMLDOMNode
Dim childNode           As MSXML.IXMLDOMNode
Dim strXMLSource        As String
Dim lngNumChild         As Long
    
    Set XMLDoc = New MSXML.DOMDocument
    
    strXMLSource = Me.cmdXMLSource.Value
    
    If strXMLSource = "" Then
        MsgBox "Er moet wel een XMLSource worden geselecteerd", vbInformation
        Exit Sub
    End If
    
    'Binnenhalen en Output wegschrijven naar tekstbox!
    Me.txtOutput.Text = Me.txtOutput.Text &amp;amp; vbCrLf &amp;amp; "XMLDoc loaded? " &amp;amp; XMLDoc.Load(strXMLSource)
    Me.txtOutput.Text = Me.txtOutput.Text &amp;amp; vbCrLf &amp;amp; "ParseError?? " &amp;amp; XMLDoc.parseError.reason
    'Hieronder gaat het FOUT!??!?
    Me.txtOutput.Text = Me.txtOutput.Text &amp;amp; vbCrLf &amp;amp; "How much childNodes?? " &amp;amp; XMLDoc.documentElement.childNodes.Length &amp;amp; vbCrLf
    
    Set root = XMLDoc.documentElement
    
    For Each childNode In root.childNodes
        Me.txtOutput.Text = Me.txtOutput.Text &amp;amp; childNode.Text &amp;amp; vbCrLf
    Next
    
End Sub
?>

Maar met php (voor de kleurtje), jammer dat er zoiets niet is voor VB/C/etc..

[ Voor 5% gewijzigd door Woudloper op 18-09-2005 23:30 ]


Verwijderd

1) MSXML versies kunnen wel degelijk grote verschillen maken. Daarom is het ook zinnig om MSXML 3.0 of hoger te gebruiken.

2) Waarschijnlijk kun je het valideren uitzetten met een property, zodat je dergelijke foutmeldingen niet krijgt.

HTH :)

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op woensdag 02 januari 2002 16:02 schreef MrX het volgende:
1) MSXML versies kunnen wel degelijk grote verschillen maken. Daarom is het ook zinnig om MSXML 3.0 of hoger te gebruiken.

2) Waarschijnlijk kun je het valideren uitzetten met een property, zodat je dergelijke foutmeldingen niet krijgt.

HTH :)
Thanx wat betreft punt 2, want had de volgende optie nog niet gezien |:(

XMLDoc.async = False

Maar wat betreft punt 1. Is het niet beter om de laagst mogelijke versie te pakken omdat je er niet vanuit kan gaan dat de gebruikers een hogere versie hebben??

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Ik heb nog even gekeken naar de diverse XML/DTD bestanden en zag het volgende:

Bij degene van jelmervos die gehost is bij wasigh krijg ik de volgende foutmelding bij het openen van het DTD:
code:
1
2
3
4
5
6
7
8
9
10
The XML page cannot be displayed 
Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later. 


--------------------------------------------------------------------------------

Cannot have a DTD declaration outside of a DTD. Line 1, Position 11 

<!ELEMENT activetopics (topic, fileinfo)>
----------^

Bij de rest van de DTD heb ik geen probleem, wel is het zo dat zoals jelmervos verteld had bij degene welke gehost is door acm er geen wijziging is gemaakt aan het DTD voor de toegevoegde node <last_replier>

Hetgeen wat ik nog niet snap is dat jelmervos geen problemen heeft met het uitlezen van dit geheel met delphi, maar het bij mij met VB helemaal niet gaat :(

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Ik kan 'm met de xml parser van php ook zonder problemen uitlezen.... Vaag !

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op woensdag 02 januari 2002 17:08 schreef rwoudsma het volgende:
Hetgeen wat ik nog niet snap is dat jelmervos geen problemen heeft met het uitlezen van dit geheel met delphi, maar het bij mij met VB helemaal niet gaat :(
Doe ik er nog een schepje bovenop: ik gebruik dezelfde MSXML (als DOM vendor) als jij :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op woensdag 02 januari 2002 16:15 schreef rwoudsma het volgende:

[..]

Maar wat betreft punt 1. Is het niet beter om de laagst mogelijke versie te pakken omdat je er niet vanuit kan gaan dat de gebruikers een hogere versie hebben??
Nee.

Ten eerste zijn versie 2.0 en 3.0 niet backwards compatible. Je zult in je code ook MSXML.* moeten veranderen naar MSXML2.

Ten tweede moet je in je setup van je software aangeven welke versie geinstalleerd moet zijn / moet worden, dus kan je zo afdwingen dat de juiste versie op de computer van de eindgebruiker komt te staan.

Succes :)

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Op woensdag 02 januari 2002 19:33 schreef jelmervos het volgende:

[..]

Doe ik er nog een schepje bovenop: ik gebruik dezelfde MSXML (als DOM vendor) als jij :)
Dat vind ik zeker vaag... Maar is het dan zo dat jij de verschillende nodes op een andere manier uitleest? Zet jij dan nog dingen aan/uit voordat je gaat parsen???

Wat ik nog steeds vreemd vindt is dat ik een foutmelding krijg bij het openen van:

http://www.wasigh.com/jelmervos/activetopics.dtd
Op woensdag 02 januari 2002 20:31 schreef MrX het volgende:

[..]

Nee.

Ten eerste zijn versie 2.0 en 3.0 niet backwards compatible. Je zult in je code ook MSXML.* moeten veranderen naar MSXML2.
Maar dus wel forward compatible... Dus kan je beter 2.0 gebruiken? Of praten we nu langs elkaar heen....

Ik :Z nog een beetje...

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Oooh, ik kan mezelf wel voor mijn kop slaan |:(

Heb de fout gevonden....
XMLDoc.async = False
XMLDoc.validateOnParse = True False
XMLDoc.resolveExternals = True
Nu geeft hij geen errors meer bij het parsen... Wel blijft het probleem van boven natuurlijk staan!

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Stel dat ik net zoals jelmervos door alle 'Active Topics' willen lopen om degene te zoeken welke gezocht moet worden. Hoe kan ik dat dan het beste doen?

A.Een nodelist maken en kijken of deze daarin zit?
code:
1
Hmmm.. Weet niet hoe je een lijst maakt met alle id's

B.Door alle nodes heen lopen en kijken of een bepaalde node gelijk is aan het te zoeken??
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
For Each childNode In root.childNodes

    Cell(rowid,1) = childNode.selectSingleNode("id").Text
    Cell(rowid,2) = childNode.selectSingleNode("titel").Text
    Cell(rowid,3) = childNode.selectSingleNode("forum").Text
    Cell(rowid,4) = childNode.selectSingleNode("forumafkorting").Text
    Cell(rowid,5) = childNode.selectSingleNode("tijd").Text
    Cell(rowid,6) = childNode.selectSingleNode("timestamp").Text
    Cell(rowid,7) = childNode.selectSingleNode("topicstarter").Text
    Cell(rowid,8) = childNode.selectSingleNode("replies").Text

    rowid = rowid + 1

Next

Nu zijn het cellen, maar kunnen dus ook variabelen zijn. waarna er dan een check kan worden gedaan, bv:
code:
1
2
3
4
5
lngTopicID = childNode.selectSingleNode("id").Text

If lngTopicID = lngIDToCompare Then
    msgbox "We have a match!!!"
End If

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Ik heb nog één vraagje...

als ik volgend stukje code gebruik.
code:
1
2
3
    For Each childNode In root.childNodes
      Me.txtOutput.Text = Me.txtOutput.Text & vbCrLf & childNode.selectSingleNode("titel").Text
    Next

Krijg ik een foutmelding op het laatst omdat de hij dan de fileinfo (baseurl, timestamp, info) binnen wil halen, maar deze heeft natuurlijk geen "titel".

Weet iemand hoe ik ervoor kan zorgen dat ik alleen door de topics kan bladeren?? Moet ik dat binnen de loop doen of moet ik tegen root zeggen dat het alleen van het type 'topic' mag zijn??? Als dat laatste zo is, kan iemand mij daar dan uitleg over geven...
Pagina: 1