Toon posts:

[javascript / XMLDOM] replaceData wordt niet ondersteund

Pagina: 1
Acties:

Verwijderd

Topicstarter
beste allemaal

ik ben begonnen met het programmeren met een XMLDOM parser, en het leek allemaal goed te lukken, totdat ik de data binnen een container in een xml bestand wou wijzigen.
ik heb verschillende methoden opgezocht en geprobeerd, maar hij geeft elke keer aan: "deze eigenschap of methode wordt niet ondersteund door dit object".

heeft iemand een idee waar ik de fout maak, want ik heb gewoon direct samples overgenomen en die deden het ook niet :|

ik draai het geheel op MSIE 6.0 sp1
de bestanden hieronder staan in dezelfde map en als ik alert() gebruik dan geeft hij de goede waarde terug, dus dat werkt.


gegevens.xml

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0"?>
<boeken>
  <boek>
    <bookid>0</bookid>
    <uitgever>het zwartepaard</uitgever>
    <schrijver>piet hein</schrijver>
    <titel>groen gras</titel>
    <isbn>23748912</isbn>
  </boek>
  <boek>
    <bookid>1</bookid>
    <uitgever>het zwartepaard</uitgever>
    <schrijver>piet hein</schrijver>
    <titel>groen gras</titel>
    <isbn>23748912</isbn>
  </boek>
</boeken>





verander.html

HTML:
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
<html>
<head>
<title>boek wijzigen</title>

<script language="javascript">
function verander() {
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load("gegevens.xml");

var bookid = 0;
var root = xmlDoc.documentElement;
//alert(root.childNodes.item(bookid).childNodes.item(1).text);
//root.childNodes.item(bookid).childNodes.item(1).replaceData(0, 15, "wolters nordhoff");
//root.childNodes.item(bookid).childNodes.item(1).setData("wolters nordhoff");
//root.childNodes.item(bookid).childNodes.item(1).nodeValue("wolters nordhoff");
//root.childNodes.item(bookid).childNodes.item(1).setNodeValue("wolters nordhoff");
root.childNodes.item(bookid).childNodes.item(1).setData("Text","wolters nordhoff");
}
</script>
<body>

<from>
<input type="button" value="bewerken" onClick="verander()">
</form>

</body>
</html>


[ Voor 15% gewijzigd door gorgi_19 op 10-04-2005 21:33 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Heb jij eigenlijk wel rechten om het xml-bestand aan te passen??

edit:
Waar roep je eigenlijk de method replaceData aan? Ik zie alleen setData...

Wanneer je een node in je DOM wilt vervangen kun je beter

.replaceChild() http://msdn.microsoft.com.../methods/replacechild.asp

of

in geval van een textNode gewoon

object.text = ''; http://msdn.microsoft.com...nce/properties/text_2.asp

(note voor de MS SDK, let even op het stukje "standards information", als daar geen W3C info bestaat kun je beter naar een wel W3C equivalent zoeken)

[ Voor 82% gewijzigd door faabman op 10-04-2005 15:24 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Verwijderd

Topicstarter
replaceData staat bovenaan als comment tekst, omdat dat niet werkte.
alle comment tekst is wat ik al geprobeerd heb en wat niet werkte.

object.text geeft ook aan dat de eigenschap of methode niet ondersteund wordt en
object.replaceChild geeft aan dat de typen niet overeenkomen:
root.childNodes.item(bookid).childNodes.item(1).replaceChild("wolters nordhoff",root.childNodes.item(bookid).childNodes.item(1).text);

ik probeer dus doormiddel van javascript gegevens uit een xml-bestand te wijzigen met gegevens die zijn ingevoerd in een formulier.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:29

gorgi_19

Kruimeltjes zijn weer op :9

Even [code][/code]-tags toegevoegd :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
heeft niemand een idee wat ik fout doe,

ik heb van alles geprobeerd, maar hij blijft met die foutmelding komen.
kan het misschien zijn dat ik een update van MSIE moet hebben om dit te laten werken?

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Ik heb het hier even getest op IE 6.0 en zo werkt het prima:

JavaScript:
1
root.childNodes.item(bookid).childNodes.item(1).text = "wolters nordhoff";

Verwijderd

Topicstarter
dank je wel amras, ik ben nu al een stukje verder, hij geeft hierbij indd geen foutmelding.
alleen wordt er nog steeds niets veranderd in het XMLdocument dus als je de browser sluit dan ben je weer terug bij af :|

code:
1
2
3
alert(root.childNodes.item(bookid).childNodes.item(1).text);
root.childNodes.item(bookid).childNodes.item(1).text = "wolters nordhoff";
alert(root.childNodes.item(bookid).childNodes.item(1).text);


bij de eerste alert geeft hij aan "het zwarte paard" en bij de 2de alert "wolters nordhoff", dus dat is mooi. Alleen als ik dan in het XMLdocument kijk, dan is er niks veranderd dus dan geeft hij de volgende keer als je je browser opent weer precies het zelfde.

ik heb gekeken of ik dit op kon lossen met een stukje FSO.opentextfile, die dan eerst het xmlbestand inleest en dan de nieuwe waarde wegschrijft. nou dat werkte niet echt en het is ook heel omslachtig vooral als je weet dat er een replace... methode bestaat.

  • André
  • Registratie: Maart 2002
  • Laatst online: 06-05 11:13

André

Analytics dude

Je laad een XML bestand in de browser, die kun je gaan bewerken enzo, maar zoland je de wijzigingen niet opslaat blijven die idd niet bewaard. Hiervoor zul je met een serverside script die schrijfrechten heeft het aangepaste bestand moeten opslaan.

Dat is hetzelfde als een website waarvan ik clientside met JS het menu 100px omlaag zet, de volgende keer dat ik op die website kom staat het menu weer bovenaan. Wil je die wijziging van 100px vasthouden zul je eerst de pagina op moeten slaan.

[ Voor 34% gewijzigd door André op 15-04-2005 16:10 ]


Verwijderd

Topicstarter
oké dat klikt indd heel logisch, maar ik wil alles juist clientside houden.
dat moet toch ook mogelijk zijn, want met FSO kan je ook bestanden lokaal aanmaken, toevoegen en verwijderen, je krijgt dan gewoon een vraag of je het activeX dinges wilt uitvoeren.

en ik dacht eigenlijk dat replaceData() en al die methodes juist waren voor clientside scripts :?

Verwijderd

Topicstarter
nou, ik heb de raad van andré opgevolgd en ben op msdn opzoek gegaan naar een methode om het xml-bestand op te slaan nadat het gewijzigd is.
ik had het volgende gevonden: object.save("naampje"); simpeler kan niet, dus ik netjes de volgende regels code bijgevoegd in mijn script:
code:
1
2
3
4
5
var xmldoc2 = new ActiveXObject("Microsoft.XMLDOM");

root.childNodes.item(bookid).childNodes.item(1).text = "wolters nordhoff";

xmlDoc.save(xmldoc2.XMLDocument);

nu geeft hij bij de "save-methode" de foutmelding dat de toegang geweigerd is :?
ik heb gekeken bij de eigenschappen/beveiliging van het document, maar daar mag ik alles en google bood ook niet veel hulp.
ik denk dat het een instelling is van MSIE die tegengaat dat er scripts worden uitgevoerd zonder toestemming, maar waar dat vinkje zit?

  • André
  • Registratie: Maart 2002
  • Laatst online: 06-05 11:13

André

Analytics dude

Als het bestand lokaal staat zou het moeten werken, als het bestand op een server staat mag het inderdaad niet vanwege de security. Dan zou je alsnog uitkomen bij een serverside script.

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10-2025
Je zou eens kunnen kijken naar XMLHTTP, daarmee kun je je xml terugsturen naar de server zonder page refresh en met een asp script opslaan. Je kunt hem natuurlijk ook gewoon submitten naar hetzelfde script, kost je dan wel een page refresh.

Verwijderd

Topicstarter
nou ik heb verder geprobeerd en gedaan en het is uiteindelijk gelukt (met een omweg)

op de site van devguru kwam ik bij de "object.save-methode" het volgende commentaar tegen:
In this case, the parameter specifies the file name. This must be a name and not a URL. If necessary, the file is created, or an existing file of the same name is overwritten. This mode is not intended for use from a secure client such as Internet Explorer.
blijkbaar kan je de save methode en waarschijnlijk ook de replacedata enzo niet gebruiken in MSIE :(
zal het wel eens proberen op mozilla, kijken of hij het dan wel doet.

ik heb het opgelost met een FSO script, zie hieronder hoe het is geworden:
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
<html>
<head>
<title>boek wijzigen</title>

<script language="javascript">
function verander() {
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load("boeken.xml");

var bookid = 0;
var root = xmlDoc.documentElement;
root.childNodes.item(bookid).childNodes.item(1).text = "wolters nordhoff";

// sla xml bestand op
 var filename = "veranderd.xml";
 var fso = new ActiveXObject("Scripting.FileSystemObject");
 var file;    
 file = fso.OpenTextFile(filename, 2, true);
 file.WriteLine(xmlDoc.xml);
}
</script>
<body>

<from>
<input type="button" value="bewerken" onClick="verander()">
</form>

</body>
</html>


het werkt goed, maar als iemand nog een betere oplossing heeft, die bijvoorbeeld code bespaard of waarbij replaceData() het wel doet, hoor ik het graag.
Pagina: 1