[ASP/XML] Leesprobleem xml bestand (charset?)

Pagina: 1
Acties:
  • 554 views sinds 30-01-2008
  • Reageer

  • Guffy
  • Registratie: Maart 2001
  • Laatst online: 30-09-2008
Ben nu al hele dag aant zoeken maar krijg het niet gevonden...

Situatie: ik probeer een xml bestand van een andere server te lezen en wil deze gaan verwerken. Dit doe ik met ASP.

De basis:
code:
1
2
3
4
5
Set xmlhttp = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
xmlhttp.Open "GET", "http://10.17.248.10/CCMCIP/xmldirectorylist.asp?l=&f=&start=31", False
xmlhttp.send
Response.Write xmlhttp.responseXML.xml
Response.End


Probleem: hij komt op plekje 35 een 'raar' teken tegen en de response geeft niets terug.
Bij start=1 heb ik geen problemen. Hij leest de eerste 30 zonder problemen in en ik kan ermee gaan werken.
Dat rare teken is gewoon een "é"

Dit heb ik ook geprobeerd:
code:
1
2
3
4
5
6
7
8
Response.CodePage="65001"
Response.CharSet = "iso-8859-1"
Set xmlhttp = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
xmlhttp.Open "GET", "http://10.17.248.10/CCMCIP/xmldirectorylist.asp?l=&f=&start=31", False
xmlhttp.setRequestHeader "CharSet", "iso-8859-1"
xmlhttp.send
Response.Write xmlhttp.responseXML.xml
Response.End


Zonder resultaat. :'( :'( Ook iso-8859-1 veranderen in utf-8 maakt niets uit.

Ik kan de xml die ik ophaal niet aanpassen.
Zal het aan de ASP kant moeten oplossen.
Als dat mogelijk is tenminste. Iemand een idee?

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 23-02 11:33

sopsop

[v] [;,,;] [v]

Probeer je binnengekomen bestand eens ongeparsed op te slaan en hem vervolgens met .loadxml te openen. Waarschijnlijk zit er een afwijking tussen de characterencoding die in de header staat en de characterencoding die gebruikt is om het xml-bestand (fysiek) te maken.

De loadxml functie is wezenlijk anders dan de functie die je nu gebruikt. Mocht dit je probleem oplossen dan heb ik wel een oplossing om dit zonder schrijfactie op je server op te lossen (d.m.v. een adodbstream).

  • Guffy
  • Registratie: Maart 2001
  • Laatst online: 30-09-2008
boppert schreef op vrijdag 24 maart 2006 @ 15:20:
Probeer je binnengekomen bestand eens ongeparsed op te slaan en hem vervolgens met .loadxml te openen. Waarschijnlijk zit er een afwijking tussen de characterencoding die in de header staat en de characterencoding die gebruikt is om het xml-bestand (fysiek) te maken.

De loadxml functie is wezenlijk anders dan de functie die je nu gebruikt. Mocht dit je probleem oplossen dan heb ik wel een oplossing om dit zonder schrijfactie op je server op te lossen (d.m.v. een adodbstream).
Ok .. euh dit werkt zonder problemen :
code:
1
2
3
4
5
6
7
Set xmlhttp = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
xmlhttp.Open "GET", "http://10.17.248.10/CCMCIP/xmldirectorylist.asp?l=&f=&start=1", False
xmlhttp.send
set objXML = Server.CreateObject("Microsoft.XMLDOM")
objXML.async = false
objXML.loadXML(xmlhttp.responseXML.xml)
objXML.Save ("D:\Test\test.xml")


Maar hij is dan ook geen rare tekens tegen gekomen.
Bij start=31 is het test.xml bestand 0 k groot :'(
Ook xmlhttp.responseBody helpt niet.

Overigens, als ik er een
Response.BinaryWrite xmlhttp.responseBody
tussendoor gooi.. krijg ik alles wel goed te zien in de browsert.

Ik zal het opslaan wel niet goed doen?

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 23-02 11:33

sopsop

[v] [;,,;] [v]

Ik geef je meteen de oplossing met de ADODBStream.
Visual Basic:
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
33
    Set xmlhttp = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
    xmlhttp.Open "GET", "http://10.17.248.10/CCMCIP/xmldirectorylist.asp?l=&f=&start=1", False
    xmlhttp.send

    Set oADOStream = Server.CreateObject("ADODB.Stream")
    
    objXML.async = False

    ' laad sXML in de ADODBStream en converteer deze naar de charset gedef. in msCharacterSet
    oADOStream.Type = 2 'adTypeText
    oADOStream.Charset = "iso-8859-1"
    oADOStream.Open
    oADOStream.WriteText xmlhttp.responsebody
    oADOStream.Position = 0
    ' converteer het geheel naar Binair om gebruikt te maken van de load functie (i.p.v. LoadXML) van het DomDocument
    oADOStream.Type = 1 ' adTypeBinary
        
    ' Valideren binaire XML-stream
    If objXML.Load(oADOStream.Read) Then
       ' parsen vanuit adodbstream gelukt
       objXML.Validate
       msXML = objXML.XML
    ElseIf objXML.Load(xmlhttp.responsebody) Then
       ' parsen met originele stream gelukt
       objXML.Validate
       msXML = objXML.XML
    End If
    ' sluiten adodbstream
    oADOStream.Close
    Set oADOStream = Nothing

    ' poep alles op het scherm
    Response.write msXML

Ik zie nu dat ik het om had gedraaid: je moet de Load i.p.v. de LoadXML functie gebruiken.

Ik heb hier destijds heel lang naar gezocht aangezien ik hetzelfde probleem bij de hand had. Ik heb er veel over kunnen vinden, maar alleen maar mensen die hetzelfde probleem hadden, en nog steeds geen oplossing.
De enige oplossing die ik heb kunnen vinden was opslaan op de harddisk, en dan via objXML.Load het bestand weer openen. Dat is natuurlijk flinke overkill. De oplossing met de ADODBStream schrijft niets weg op de harddisk. Er zit ook een fail-save in: mocht het parsen met iso-8859-1 niet lukken (het gaat namelijk fout zodra er wel utf-8 diakrieten in de tekst staan) dan wordt er zonder poespas geparsed. Dit gaat altijd goed (dat wil zeggen: ik heb veel getest en er hebben zich geen probleem gevallen meer voorgedaan).

[ Voor 145% gewijzigd door sopsop op 24-03-2006 16:25 ]


  • Guffy
  • Registratie: Maart 2001
  • Laatst online: 30-09-2008
boppert schreef op vrijdag 24 maart 2006 @ 16:01:
Ik geef je meteen de oplossing met de ADODBStream.
Visual Basic:
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
33
    Set xmlhttp = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
    xmlhttp.Open "GET", "http://10.17.248.10/CCMCIP/xmldirectorylist.asp?l=&f=&start=1", False
    xmlhttp.send

    Set oADOStream = Server.CreateObject("ADODB.Stream")
    
    objXML.async = False

    ' laad sXML in de ADODBStream en converteer deze naar de charset gedef. in msCharacterSet
    oADOStream.Type = 2 'adTypeText
    oADOStream.Charset = "iso-8859-1"
    oADOStream.Open
    oADOStream.WriteText xmlhttp.responsebody
    oADOStream.Position = 0
    ' converteer het geheel naar Binair om gebruikt te maken van de load functie (i.p.v. LoadXML) van het DomDocument
    oADOStream.Type = 1 ' adTypeBinary
        
    ' Valideren binaire XML-stream
    If objXML.Load(oADOStream.Read) Then
       ' parsen vanuit adodbstream gelukt
       objXML.Validate
       msXML = objXML.XML
    ElseIf objXML.Load(xmlhttp.responsebody) Then
       ' parsen met originele stream gelukt
       objXML.Validate
       msXML = objXML.XML
    End If
    ' sluiten adodbstream
    oADOStream.Close
    Set oADOStream = Nothing

    ' poep alles op het scherm
    Response.write msXML

Ik zie nu dat ik het om had gedraaid: je moet de Load i.p.v. de LoadXML functie gebruiken.

Ik heb hier destijds heel lang naar gezocht aangezien ik hetzelfde probleem bij de hand had. Ik heb er veel over kunnen vinden, maar alleen maar mensen die hetzelfde probleem hadden, en nog steeds geen oplossing.
De enige oplossing die ik heb kunnen vinden was opslaan op de harddisk, en dan via objXML.Load het bestand weer openen. Dat is natuurlijk flinke overkill. De oplossing met de ADODBStream schrijft niets weg op de harddisk. Er zit ook een fail-save in: mocht het parsen met iso-8859-1 niet lukken (het gaat namelijk fout zodra er wel utf-8 diakrieten in de tekst staan) dan wordt er zonder poespas geparsed. Dit gaat altijd goed (dat wil zeggen: ik heb veel getest en er hebben zich geen probleem gevallen meer voorgedaan).
hmmmz...
zou ik het eerste probleem geval zijn? :'( :'(

ik gebruik je code ...
overigens met set objXML = Server.CreateObject("Microsoft.XMLDOM") er nog bij op regel 6

bij start=1 gaat ie goed....
maar bij start=31 geeft niets terug :? :?

  • André
  • Registratie: Maart 2002
  • Laatst online: 23-02 17:02

André

Analytics dude

ASP = PRG

  • Guffy
  • Registratie: Maart 2001
  • Laatst online: 30-09-2008
oeps sorry
tnx 4 the fix
Pagina: 1