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

question-closed [HTML] Problem ze skryptem

Object Storage Arubacloud
0 głosów
194 wizyt
pytanie zadane 29 czerwca 2020 w JavaScript przez mm Użytkownik (890 p.)
zamknięte 6 września 2020 przez mm

Hej :)

Piszę stronę w HTML i mam taki kod:
 

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html" charset="utf-8">
<title>Bazy Danych</title>
<style type="text/css">
<!--
#baner {color:white; background-color:red; padding:20px; text-align:center; font-family:Arial;}
#panel_lewy {width:100%; text-align:center; height:1500px; clear:both; float:left; background-color:white;}
	#stopka{color:white; background-color:blue; padding:10px; text-align:center; font-family:Arial; clear:both;}
	a{color:white;}
	table,tr,td {
	border : 1px solid black;
	border-collapse: collapse;
	}
	th,td {
	padding: 5px;
	}
	table.center {
    margin-left:auto; 
    margin-right:auto;
  }
-->
</style>
</head>


<body>
<div id="baner"><h1>PLIK XML </h1></div>
<div id="panel_lewy">
<script>
xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET", "C:\Users\PC\Documents\Bazy_Danych\departments.xml", false);
xmlDoc=xmlhttp.responseXML;
var table="<tr><th>id</th><th>code</th><th>capital</th><th>region</th><th>name</th></tr>";
var x=xmlDoc.getElementsByTagName("department");
for(i=0;i<x.length;i++){
document.write("<tr><td>");
document.write(x[i].getElementsByTagName("id")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("code")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("capital")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("region")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("name")[0].childNodes[0].nodeValue);
document.write("</td></tr>");
}



</script>
</div>

</body>
</html>


I teraz jak już uruchomię tę stronę w przeglądarce nie wyświetla się to co powinno i w konsoli jest następujący błąd : "xmlDoc is null". Mógłby ktoś mi podpowiedzieć jak się pozbyć tego błędu?

 

Z góry dzięki za odpowiedź :)

komentarz zamknięcia: Problem rozwiązany
komentarz 29 czerwca 2020 przez mm Użytkownik (890 p.)
Dzięki za wskazówki :)

2 odpowiedzi

+2 głosów
odpowiedź 29 czerwca 2020 przez Comandeer Guru (601,590 p.)

Ajax nie działa dla plików lokalnych. Dodatkowo robisz żądanie synchronicznie, co całkiem możliwe, że jest zablokowane przez część przeglądarek jako zbyt obciążające główny wątek.

Musiałbyś to odpalać z poziomu serwera i podawać ścieżkę do pliku bez odwołań do systemu plików (C:\ itd.).

komentarz 29 czerwca 2020 przez mm Użytkownik (890 p.)
Rozumiem. Czy jest jakiś inny sposób, żeby wyświetlić na stronie plik xml w formie tabeli?
komentarz 29 czerwca 2020 przez eunstachy Stary wyjadacz (14,180 p.)

Wystarczy, że plik xml wrzucisz na serwer np do data/departments.xml a następnie zmienisz 

xmlhttp.open("GET", "data/departments.xml", false);

A do ajaxa polecam użyć axiosa, wtedy kod będzie wyglądał mniej więcej tak

axios.get('/documents/departments.xml).then(response => {
  // Display results
)

Przy okazji, w pętli for zamiast wielokrotnie powtarzać document.write powinieneś kod HTML zebrać do zmiennej i użyć document.write tylko raz na końcu. 

komentarz 30 czerwca 2020 przez VBService Ekspert (253,420 p.)
edycja 30 czerwca 2020 przez VBService

Jest jeszcze jeden sposób jak chcesz lokalnie otworzyć plik xml i użyć formatowania danych, przetwarzania danych z użyciem: javascript, html, css, bez uruchamiania serwera i wrzucania plików na serwer (xml). Ten mechanizm jest wbudowany w Windows, "skrypciarze" go używają, żeby stworzyć namiastkę GUI dla skryptów (budowanie gui oparte o html, css, javascript (wykorzystywany jest silnik IE, Edge), vbscript, dll - używając DynaWrap.dll). Coś na wzór: , tyle że nie z takim rozmachem co oferuje elektron, ale jest "wbudowane" w windows, nic nie trzeba instalować. Wraz z pojawieniem się IE9 można robić tło "animowane" za pomocą np.: krótkiego filmu w mp4.
Dawno temu napisałem taki licznik, mój brat Mnie poprosił, który odliczał czas do Mojego przyjazdu (urlopu), mieszkamy daleko od siebie. wink no i w pracy pisałem wiele razy takie gui do skryptów dla active directory. [ prezentacja-licznik  - sorki za jakość, robiony na prędce telefonem z "łapy" wink ]

P.S. Czy mógłby ktoś przy okazji polecić jakiś darmowy i prosty program do nagrywania pulpitu.

komentarz 1 lipca 2020 przez mm Użytkownik (890 p.)
Ja chciałabym, żeby ten plik w xml wyświetlał się na stronie w formie tabelki. W jaki sposób mogę to zrobić?
komentarz 1 lipca 2020 przez Comandeer Guru (601,590 p.)
Najłatwiej byłoby to wrzucić na serwer – po prostu. Wówczas Ajax będzie działał i nie będzie problemu z dostępem do pliku XML. Nie ma za bardzo innego sposobu na wczytanie zewnętrznego pliku.

W ostateczności można wsadzić zawartość tego pliku XML bezpośrednio do kodu JS.
+1 głos
odpowiedź 2 lipca 2020 przez VBService Ekspert (253,420 p.)
edycja 2 lipca 2020 przez VBService

Do testowania (uruchamiania) na komputerze domowym polecam zainstalowanie: XAMPP  [ Introduction to XAMPP ] [ How to Install XAMPP Server on Windows ... ]

Po instalacji XAMPP'a w katalogu "roboczym" o nazwie: htdocs umieszczasz swoje pliki np.: tak
(w Moim przypadku XAMPP zainstalowany jest na dysku E:)

departments.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <department>
        <id>1</id>
        <code>code_1</code>
        <capital>capital_1</capital>
        <region>region_1</region>
        <name>name_1</name>
    </department>
    <department>
        <id>2</id>
        <code>code_2</code>
        <capital>capital_2</capital>
        <region>region_2</region>
        <name>name_2</name>
    </department>
    <department>
        <id>3</id>
        <code>code_3</code>
        <capital>capital_3</capital>
        <region>region_3</region>
        <name>name_3</name>
    </department>
    <department>
        <id>4</id>
        <code>code_4</code>
        <capital>capital_4</capital>
        <region>region_4</region>
        <name>name_4</name>
    </department>
</root>

bazy_danych.html  [pozostawiłem Twoje "stylowanie" css]

<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="utf-8">
        <title>Bazy Danych</title>

    <style type="text/css">
        #baner {
            color: white;
            background-color: red;
            padding: 20px;
            text-align: center;
            font-family: Arial;
        }
        #panel_lewy {
            width: 100%;
            text-align: center;
            height: 1500px;
            clear: both;
            float: left;
            background-color: white;
            padding-top: 10px;
        }
        #stopka {
            color: white;
            background-color: blue;
            padding: 10px;
            text-align: center;
            font-family: Arial;
            clear: both;
        }
        a {
            color: white;
        }
        table, tr, td {
            border: 1px solid black;
            border-collapse: collapse;
        }
        th, td {
            padding: 5px;
        }
        table.center {
            margin-left: auto;
            margin-right: auto;
        }
    </style>
    </head>
    <body>
        <div id="baner"><h1>PLIK XML</h1></div>
        <div id="panel_lewy"></div>

    <script>
        function showInPanel(str) {
            const panel = document.getElementById("panel_lewy");
            panel.innerHTML = str;
        }
        function onProgress(e) {
            let percent = (e.position / e.totalSize) * 100;
            const status = "Pobieram dokument ... " + percent + "%";
            showInPanel(status);
        }
        function onError(e) {
            const status = "Błąd podczas pobierania dokumentu\n" + e.target.status;
            showInPanel(status);
        }
        function onLoad(e) {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                const xmlDoc = xmlHttp.responseXML;
                const data = xmlDoc.getElementsByTagName("department");
                let html = "<table>";
                html += "<tr><th>id</th><th>code</th><th>capital</th><th>region</th><th>name</th></tr>";
                for (i=0; i<data.length; ++i) {
                    html += "<tr><td>";
                    html += data[i].getElementsByTagName("id")[0].childNodes[0].nodeValue;
                    html += "</td><td>";
                    html += data[i].getElementsByTagName("code")[0].childNodes[0].nodeValue;
                    html += "</td><td>";
                    html += data[i].getElementsByTagName("capital")[0].childNodes[0].nodeValue;
                    html += "</td><td>";
                    html += data[i].getElementsByTagName("region")[0].childNodes[0].nodeValue;
                    html += "</td><td>";
                    html += data[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
                    html += "</td></tr>";
                }
                html += "</table>"
                showInPanel(html);
            } else if (xmlHttp.readyState == 4 && xmlHttp.status == 404) {
                const status = "404 - Podany plik <b>xml</b> nie został odnaleźiony w podanej lokalizacji";
                showInPanel(status);
            }
        }

        const xmlHttp = new XMLHttpRequest();
        xmlHttp.onprogress = onProgress;
        xmlHttp.onerror = onError;
        xmlHttp.onload = onLoad;
        xmlHttp.open("GET", "departments.xml", true);
        xmlHttp.overrideMimeType('text/xml');
        xmlHttp.send(null);
    </script>
    </body>
</html>

... możesz pliki xml umieścić tak:

... wtedy zmieniasz kod javascript w tej lini:


z
xmlHttp.open("GET", "departments.xml", true);

na
xmlHttp.open("GET", "xml/departments.xml", true);

... w przeglądarce internetowej w polu adresu wpisujesz: localhost/bazy_danych.html

... nie zapomnij uruchomić serwer z panelu kontrolnego XAMPP
 

... w tym przykładzie, w kodzie javascript, nieuwzględniony jest problem: Pomijanie pamięci podręcznej tzn., w wielkim skrócie, że po pierwszym pobraniu dokumentu departments.xml i wyświetleniu jego zawartość w przeglądarce, wprowadzone w tym czasie zmiany w dokumencie departments.xml (dodanie kolejnego rekordu, edycja itp.) mogą się nie wyświetlać po ponownym uruchomieniu bazy_danych.html , lecz zostanie wyświetlona zawartość pliku departments.xml, która obecnie znajduje się w pamięci podręczne przeglądarki (cache). Można ręcznie użyć: F5 + Ctrl winklub dopisać (zamienić kod):

z:
xmlHttp.open("GET", "departments.xml", true);

na:
let url = "departments.xml";
url += (url.match(/\?/) == null ? '?' : '&') + (new Date()).getTime();
xmlHttp.open("GET", url, true);



z:
xmlHttp.open("GET", "xml/departments.xml", true);

na:
let url = "xml/departments.xml";
url += (url.match(/\?/) == null ? '?' : '&') + (new Date()).getTime();
xmlHttp.open("GET", url, true);

XMLHttpRequest ] [ XMLHttpRequest - how can one bypass cache? ]

komentarz 2 lipca 2020 przez mm Użytkownik (890 p.)

Wszystko działa yessmiley  Dziękuję Ci bardzo za pomoc smiley

Podobne pytania

0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 18 stycznia 2020 w Inne języki przez Andrey53 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 268 wizyt
+1 głos
0 odpowiedzi 284 wizyt
pytanie zadane 27 czerwca 2021 w Ogłoszenia, zlecenia przez Superchomio Nowicjusz (150 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...