• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

XML w JavaScript - problem w uruchamianiu przykładów

VPS Starter Arubacloud
0 głosów
1,013 wizyt
pytanie zadane 7 listopada 2016 w JavaScript przez Feroxon Obywatel (1,100 p.)
zmienione kategorie 7 listopada 2016 przez Arkadiusz Waluk

Witam. Od pewnego czasu zmagam się z xml i nie za bardzo mi to wychodzi :/ do tego stopnia że tutorial przepisany/przekopiowany z internetu nie chce chodzić :D Ma ktoś pomysł dlaczego to nie chce działać? Tyle czasu próbuję zgłębić ten problem, że zaczynam się już poddawać frown

Link do tutorialu

<html>
  <head>
    <title>Reading XML file</title>
    <script>
    function readXML()
    {
      var xml = new XMLHttpRequest();
      xml.open('GET','xml.xml, false');
      xml.send();
      var xmlData = xml.responseXML;

      if(!xmlData)
      {
        xmlData = (new DOMParser()).parseFromString(xml.responseText, 'text/xml');
        var emp = xmlData.getElementsByTagName("employee");
        var name = emp[0].getElementsByTagName("name")[0].firstChild.data;
        var age = emp[0].getElementsByTagName("age")[0].firstChild.data;
        var salary = emp[0].getElementsByTagName("salary")[0].firstChild.data;

        document.write("Name="+name+"<br>");
        document.write("Age="+age+"<br>");
        document.write("salary="+salary+"<br>");
      }
    }
    </script>

  </head>
  <body>
    <h1>XML File</h1>
    <button onclick="readXML()">Read XML File</button>

  </body>
</html>
<?xml version="1.0"?>
<company>
  <employee>
      <name>Chrish</name>
      <age>40</age>
      <salary>$2000</salary>
  </employee>
</company>

 

1
komentarz 7 listopada 2016 przez ScriptyChris Mędrzec (190,190 p.)

      xml.open('GET','xml.xml, false');

Literówka? Powinno być xml.open('GET','xml.xml', false); 

komentarz 7 listopada 2016 przez Feroxon Obywatel (1,100 p.)

Ooo... sprawdzałem kilka razy, a jednak przeoczyłem :) Niestety pojawił się kolejny błąd

Użycie synchronicznej wersji metody XMLHttpRequest w głównym wątku jest przestarzałe z powodu szkodliwych efektów ubocznych. Więcej informacji można znaleźć na stronie http://xhr.spec.whatwg.org

komentarz 7 listopada 2016 przez Comandeer Guru (599,730 p.)
No bo powinno być asynchronicznie.
komentarz 7 listopada 2016 przez ScriptyChris Mędrzec (190,190 p.)

Co do błędu, to link do specki: https://xhr.spec.whatwg.org/#the-open()-method

Zamień false na true - dokładnie w linijce, w której wskazałem literówkę. Chodzi o to, aby żądanie XHR zostało wykonane asynchronicznie.

[edit]

Comandeer mnie wyprzedził.

komentarz 7 listopada 2016 przez Feroxon Obywatel (1,100 p.)

Ja też :) zamieniłem już "true" i szukam w google kolejnej rzeczy :D

TypeError: emp[0] is undefined

1
komentarz 7 listopada 2016 przez Comandeer Guru (599,730 p.)
komentarz 7 listopada 2016 przez ShiroUmizake Nałogowiec (46,300 p.)
Js nie jest wielowatkowy , przez to ze request zajmuje okreslony czas a js obecnym kodzie czyta odrazu przez co nie jest w stanie typu obiektu.mozliwe rozwiazania callback,promise,fetch lub async await.js. pogoogluj te pojecia to znajdziesz odpowiednie rozwiazania

 

.
komentarz 8 listopada 2016 przez Feroxon Obywatel (1,100 p.)

Pomęczyłem się trochę i spróbowałem metody "promise" :) coś jest jednak źle bo żadnego efektu brak, a konsola niczym nie odpowiada :/

<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Reading XML file</title>
    <script>
    function readXML()
    {
      let pierwszy = function(){
        return new Promise(function(resolve,reject) {

          var xml = new XMLHttpRequest();
          xml.open('GET','xml.xml', true);
          xml.send();
          var xmlData = xml.responseXML;
          resolve('pobrano');
        });
      };

      let drugi = function(resolve,reject) {
        return new Promise(function(resolve,reject) {

          if(!xmlData)
            {
            xmlData = (new DOMParser()).parseFromString(xml.responseText, 'text/xml');
            var emp = xmlData.getElementsByTagName("employee");
            var name = emp[0].getElementsByTagName("name")[0].firstChild.data;
            var age = emp[0].getElementsByTagName("age")[0].firstChild.data;
            var salary = emp[0].getElementsByTagName("salary")[0].firstChild.data;

            document.write("Name="+name+"<br>");
            document.write("Age="+age+"<br>");
            document.write("salary="+salary+"<br>");
            }
          resolve('koniec')
        })
      }

      pierwszy().then(function() {
        return drugi();
      }).then(function() {
        console.log('finished');
      })
    }

    </script>

  </head>
  <body>
    <h1>XML File</h1>
    <button onclick="readXML()">Read XML File</button>

  </body>
</html>

 

komentarz 8 listopada 2016 przez Comandeer Guru (599,730 p.)

Bo wywołujesz resolve zanim Ajaks się wykona.

1 odpowiedź

+1 głos
odpowiedź 7 listopada 2016 przez Comandeer Guru (599,730 p.)
A czy konsola coś rzuca?
komentarz 7 listopada 2016 przez Feroxon Obywatel (1,100 p.)

 Sprawdziłem, wyrzuca coś takiego

Kodowanie znaków dokumentu HTML nie zostało zadeklarowane. Podczas wyświetlania tego dokumentu w niektórych konfiguracjach przeglądarki niektóre znaki spoza zakresu US-ASCII (o ile występują) mogą wyglądać nieprawidłowo. Kodowanie znaków strony musi być zadeklarowane w dokumencie lub w protokole przesyłania.

komentarz 7 listopada 2016 przez ScriptyChris Mędrzec (190,190 p.)

Kodowanie znaków dokumentu HTML nie zostało zadeklarowane

Pewnie chodzi o brak:

<meta charset="UTF-8">

wewnątrz <head>. Zapomniałeś też o:

<!DOCTYPE HTML>
komentarz 7 listopada 2016 przez Feroxon Obywatel (1,100 p.)
Tego błędu już nie wyrzuca :) faktycznie zapomniałem :/

Podobne pytania

0 głosów
1 odpowiedź 1,676 wizyt
pytanie zadane 8 sierpnia 2018 w JavaScript przez Jumpeq Początkujący (270 p.)
0 głosów
1 odpowiedź 1,046 wizyt
pytanie zadane 27 października 2016 w JavaScript przez Newperty Początkujący (280 p.)
0 głosów
0 odpowiedzi 359 wizyt
pytanie zadane 7 lutego 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...