[Javascript] XML parse problemen

Pagina: 1
Acties:

  • Entity_Razer
  • Registratie: Januari 2004
  • Laatst online: 05-03-2025
Wel ik ben met een site bezig die XML files gebruikt die de inhoud van de site bevatten en deze natuurlijk parsed om deze op het scherm te krijgen..

Nu bij het laden moet hij een XML file inlezen en in de div txtMain smijten.

Dit doe ik door
code:
1
2
3
4
5
function toonXML()
{
    document.getElementById("txtMain").innerHTML = " ";
    document.getElementById("txtMain").innerHTML = xmlDoc.getElementsByTagName("beschrijving1");
}

te gebruiken. De functie toonXML wordt aangeroepen vlak na heel de XML file in te laden met
code:
1
    xmlDoc.load(sFileName);



Ik ga even heel de JS file hier in steken is niet zo moeillijk van structuur denk ik maar gewoon redelijk veel.

De code begint bovenaan met xmlDoc enzo aan te maken omdat als ik deze in een functie stak (die bij de load van de body wordt aangeroepen) alles laat parsen in scope problemen had.

Dus door dit te doen vermijd ik scope problemen. onderaan staat een functie parseXML. deze is de parser zelf die alles parsed en moet tonen.

maar alles runned en ik krijg geen foutmeldingen noch in FF noch in IE maar ipv daarvan komt er in de txtMain div, waar normaal alle text moet staan hetvolgende te staan:

in IE :
[OBJECT]
en in FF staat er:
[object HTMLCollection]

heeft iemand enig idee hoe dit ik kan oplossen?

De javascript file vind je hier:
(de init staat er niet bij aangezien de JS file een aparte file is en de init in de HTMl file staat. het enigste dat de init doet is:
parseXML("home.xml");
meer niet.

Alvast bedankt voor alle hulp die je zou kunnen geven. ik wil dit probleem echt zo snel mogelijk uit de voeten hebben zodat ik zo snel mogelijk men site af kan hebben :D

Cheers


code:
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
34
35
36
/// JavaScript Document
    if(navigator.userAgent.indexOf('MSIE') !=-1)
{

    xmlDoc =  new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;               // volledig opladen 
    xmlDoc.validateOnParse=true;        //default : true

    //window.alert("We zitten in IE");
    

}else if((navigator.appName=='Netscape')&&(navigator.userAgent.indexOf('Opera')==-1)){

    var xmlDoc = document.implementation.createDocument("","",null);

    xmlDoc.async = false; 
    xmlDoc.validateOnParse=true ;

}


function toonXML()
{
    document.getElementById("txtMain").innerHTML = " ";
    document.getElementById("txtMain").innerHTML = xmlDoc.getElementsByTagName("beschrijving1");
    }


function parseXML(sFileName)
{
    sFileName=unescape(sFileName);
    
    xmlDoc.load(sFileName); 
    toonXML();
    //window.alert(xmlDoc.firstChild.firstChild.nodeName);
}

The Idea is not to arrive at the grave, safely in a well preserved body, but to slide in sideways at 400 miles an hour screaming of pure joy


Verwijderd

code:
1
document.getElementById("txtMain").innerHTML = xmlDoc.getElementsByTagName("beschrijving1");
Beetje onzin hè? document.getElementsByTagName geeft een NodeList terug. Dat is dus geen string. Verder gebruik je DOM, en kun je dus beter geen innerHTML gebruiken.

Verder ga ik al niet kijken, omdat die fout waarschijnlijk door het door mij benoemde punt veroorzaakt wordt.

  • GigaTexel_BE
  • Registratie: April 2002
  • Laatst online: 08:18

GigaTexel_BE

AMD MP²

edit:
niet goed gelezen

[ Voor 91% gewijzigd door GigaTexel_BE op 12-08-2006 18:38 ]

Siesteem Spekkies!


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12-02 13:44
Oftwel: xmlDoc.getElementsByTagName("beschrijving1")[0].nodeValue/innerHTML o.i.d. gebruiken.

[ Voor 5% gewijzigd door djluc op 12-08-2006 18:41 ]


  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Er was vziw nog een issue met namespaces (en doctypes?). Je kunt niet zomaar een stuk uit de DOM van je XMLHTTPRequest-response-doc in je HTML doc prikken in IE6. Met moderne browsers kan dat wel, mits je netjes opgeeft dat de XMLHttpRequest-response-doc dezelfde namespace heeft als de DOM waar je die respons weer gaat inprikken. Ik weet niet of er een nette oplossing hiervoor is voor IE.

innerHTML zou ik niet gebruiken; het werkt niet eens in correct geserveerde XHTML.

  • Entity_Razer
  • Registratie: Januari 2004
  • Laatst online: 05-03-2025
djluc schreef op zaterdag 12 augustus 2006 @ 18:41:
Oftwel: xmlDoc.getElementsByTagName("beschrijving1")[0].nodeValue/innerHTML o.i.d. gebruiken.
ik heb dus de code verandert naar:
code:
1
document.getElementById("txtMain").nodeValue = xmlDoc.getElementsByTagName("beschrijving1")[0].nodeValue;


en nu geeft zowel FF als IE niets meer. De site op zich wordt wel geladen maar er wordt niets ingevuld. en er wordt niets van fouten aangegeven dus ik zit vast ... :s

Kan iemand ma aub uit de nood helpen en me zeggen waar ik juist verkeerd zit en hoe ik dit kan oplossen?

Men Javascript skills zijn niet super maar ik probeer...

De XML is valid (wel geen DTD voor geschreven maar dit is niet echt nodig voor wat ik er mee ga doen) en al de JS code normaal ook.

Alvast bedankt

The Idea is not to arrive at the grave, safely in a well preserved body, but to slide in sideways at 400 miles an hour screaming of pure joy


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12-02 13:44
Probeer de 0 eens door een 1 te vervangen, soms heb je spaces die gezien worden als nodes.

  • Entity_Razer
  • Registratie: Januari 2004
  • Laatst online: 05-03-2025
djluc schreef op zaterdag 12 augustus 2006 @ 20:56:
Probeer de 0 eens door een 1 te vervangen, soms heb je spaces die gezien worden als nodes.
resultaat: reference to undefined property
en bij getElementsByTagName staat er getElementsByTagName("beschrijving1") has no properties.

Wat dus hetzelfde is met de andere error melding.

Als ik de alert aanzet die een alert geeft als de parsing compleet is dan krijg ik die ook die alert (als ik het terug op 0 zet :p maar het probleem is dus dat er geen text in de txtMain div wordt gezet.

The Idea is not to arrive at the grave, safely in a well preserved body, but to slide in sideways at 400 miles an hour screaming of pure joy


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12-02 13:44
JavaScript:
1
document.getElementById("txtMain").innerHTML = xmlDoc.getElementsByTagName("beschrijving1")[0].nodeValue;


Stuur even een linkje naar een online voorbeeld verder...

[ Voor 26% gewijzigd door djluc op 12-08-2006 21:06 ]


  • Entity_Razer
  • Registratie: Januari 2004
  • Laatst online: 05-03-2025
djluc schreef op zaterdag 12 augustus 2006 @ 21:06:
JavaScript:
1
document.getElementById("txtMain").innerHTML = xmlDoc.getElementsByTagName("beschrijving1")[0].nodeValue;


Stuur even een linkje naar een online voorbeeld verder...
Geeft ook niets en geen foutmeldingen.

Een on line voorbeeld? dus wat ik wil bereiken? heb ik niet. Ik kan je wel de site zelf uploaden (wel de WIP)

die kan je vinden op EDIT: Goede link: http://www.entity-project.be/fest/index.htm

[ Voor 11% gewijzigd door Entity_Razer op 12-08-2006 21:12 ]

The Idea is not to arrive at the grave, safely in a well preserved body, but to slide in sideways at 400 miles an hour screaming of pure joy


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:34

crisp

Devver

Pixelated

Je wilt waarschijnlijk de nodeValue van de textNode in je 'beschrijving1' element hebben.
Overigens is UA-string sniffing ook iets van de vorige eeuw...

Intentionally left blank


  • Entity_Razer
  • Registratie: Januari 2004
  • Laatst online: 05-03-2025
crisp schreef op zaterdag 12 augustus 2006 @ 21:42:
Je wilt waarschijnlijk de nodeValue van de textNode in je 'beschrijving1' element hebben.
Overigens is UA-string sniffing ook iets van de vorige eeuw...
euh.....

:s
In nederlands aub? :D

Die nodevalue van de textnode hebbek verstaan en dat is: Ja ik wil dus hebben wat er tussen <beschrijving1></beschrijving1> staat :)

dat 2de.. euh... knikken en lachen? :s
edit: als je met UA sniffing die User Agent bedoelt (browser detectie dus) dat is hoe we het geleerd hebben op school :D Blame the teacher not me :p

[ Voor 13% gewijzigd door Entity_Razer op 12-08-2006 21:57 ]

The Idea is not to arrive at the grave, safely in a well preserved body, but to slide in sideways at 400 miles an hour screaming of pure joy


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12-02 13:44
Heb even snel je code bekeken:
1. Geen code zomaar uitvoeren. Zet het gedeelte tot regel "function toonXML" in de onload.
2. Denk goed na over de scope van een variable. Je moet zorgen dat je de scope altijd zo klein mogelijk houdt. Dus geen globale variablen in functies e.d.
3. Gebruik de DOM inspector. Dan zie je o.a. dat je firstChild.nodeValue moet hebben. De tekst binnen een element is namelijk een nieuwe node en wel de eerste childNode. De DOM inspector is een must als je dit soort scripts gaat maken.
4. Geen harde verwijzingen naar JS functies in je HTML, vrijwel nooit nodig.

Example welke redelijk netjes is:
JavaScript:
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
function importXML(path) {
    if (document.implementation && document.implementation.createDocument) {
        xmlDoc = document.implementation.createDocument("", "", null);
        xmlDoc.onload = handleXML;
    } else if (window.ActiveXObject) {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.onreadystatechange = function () {
            if (xmlDoc.readyState == 4) {
                handleXML();
            }
        };
    } else {
        alert('Your browser can\'t handle this script');
        return;
    }
    xmlDoc.load(path);
}


function onloadHandler() {
    importXML('home.xml');
}

function handleXML() {
    var res=document.createElement('div');
    res.appendChild(document.createTextNode(xmlDoc.getElementsByTagName('beschrijving1')[0].firstChild.nodeValue));
    document.getElementById("txtMain").appendChild(res);
    //alert(xmlDoc.getElementsByTagName('beschrijving1')[0].firstChild.nodeValue);
}

window.onload=onloadHandler;

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Festi-Vault 2005-2006</title>
        <link rel="stylesheet" href="style.css" type="text/css" />
        <script src="parse_crossbrowser.js" type="text/javascript"></script>
    </head>
    <body>
            <div id="txtMain">
                dit is in de main aanwezig.
            </div>
    </body>
</html>

XML:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<boodschappen>
    <winkels>
        <winkel id="bakker">
            <produkt>
                <beschrijving1>dit komt er met AJAX</beschrijving1>
            </produkt>
        </winkel>
    </winkels>
</boodschappen>

  • Entity_Razer
  • Registratie: Januari 2004
  • Laatst online: 05-03-2025
WOW nice bedankt voor de hulp.

Ik heb je code gecopy paste en werkt perfect. enorm bedankt.

En enorm bedankt voor de hulp ook en de uitleg die je gepost hebt.

Ontzettend bedankt man _/-\o_ _/-\o_

[ Voor 86% gewijzigd door Entity_Razer op 13-08-2006 14:45 ]

The Idea is not to arrive at the grave, safely in a well preserved body, but to slide in sideways at 400 miles an hour screaming of pure joy

Pagina: 1