парсинг xml с сайта используя js
мне дали задание написать гаджет рабочего стола для win 7, который бы отображал погодные данные с метеостанции нашей организации. На сервере я сделал скрипт который генерирует мне xml со следующим содержанием:
<?xml version="1.0" encoding="utf-8"?> <weather> <day name="day">14</day> <month name="month">12</month> <year name="year">2012</year> <hour name="hour">11</hour> <minute name="minute">26</minute> <temp name="temperature">-20.0</temp> <wind name="wind">3.3</wind> <maxwind name="maxwind">5.2</maxwind> </weather> Вопрос: как при помощи js парсить данный файл p.s. я не очень-то владею js к сожалению. |
Есть очень простой вариант с использованием jQuery.parseXML, но он Вам вряд ли подойдет.
Попробуйте так: function parseXML() { var doc = new ActiveXObject(‘Microsoft.XMLDOM’); doc.loadXML(str); return doc; } Далее с doc работаете как с обычным DOM Element, например, var _day = doc.getElementsByTagName('day').text(); |
Сделал вот так:
на стороне сервера weather_save.php:
<?php // Соединение с бд $link = mysql_connect('host', 'user', 'pass'); mysql_select_db('name_db'); // выборка погодных данных $result = mysql_query("SELECT id, wind, temp, maxwind, (date_format(date, '%H')) AS H, (date_format(date, '%i')) AS i, (date_format(date, '%d')) AS d, (date_format(date, '%m')) AS m, (date_format(date, '%Y')) AS y FROM name_table ORDER BY id DESC LIMIT 1"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $id = $row[0]; $w = $row[1]; $t = $row[2]; $mw = $row[3]; $h = $row[4]; $i = $row[5]; $d = $row[6]; $m = $row[7]; $y = $row[8]; //Создаем XML файл $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; $weather = $doc->createElement('weather');// корневой элемент для XML документа $doc->appendChild($weather); $day = $doc->createElement('day',$d);// дочерний элемент, его значение $weather->appendChild($day); $date_att = $doc->createAttribute('name');// атрибут $day->appendChild($date_att); $att_text = $doc->createTextNode('day');// значение атрибута $date_att->appendChild($att_text); $month = $doc->createElement('month',$m); $weather->appendChild($month); $month_att = $doc->createAttribute('name'); $month->appendChild($month_att); $att_text = $doc->createTextNode('month'); $month_att->appendChild($att_text); $year = $doc->createElement('year',$y); $weather->appendChild($year); $year_att = $doc->createAttribute('name'); $year->appendChild($year_att); $att_text = $doc->createTextNode('year'); $year_att->appendChild($att_text); $hour = $doc->createElement('hour',$h); $weather->appendChild($hour); $hour_att = $doc->createAttribute('name'); $hour->appendChild($hour_att); $att_text = $doc->createTextNode('hour'); $hour_att->appendChild($att_text); $minute = $doc->createElement('minute',$i); $weather->appendChild($minute); $minute_att = $doc->createAttribute('name'); $minute->appendChild($minute_att); $att_text = $doc->createTextNode('minute'); $minute_att->appendChild($att_text); $temp = $doc->createElement('temp',$t); $weather->appendChild($temp); $temp_att = $doc->createAttribute('name'); $temp->appendChild($temp_att); $att_text = $doc->createTextNode('temperature'); $temp_att->appendChild($att_text); $wind = $doc->createElement('wind',$w); $weather->appendChild($wind); $wind_att = $doc->createAttribute('name'); $wind->appendChild($wind_att); $att_text = $doc->createTextNode('wind'); $wind_att->appendChild($att_text); $maxwind = $doc->createElement('maxwind',$mw); $weather->appendChild($maxwind); $maxwind_att = $doc->createAttribute('name'); $maxwind->appendChild($maxwind_att); $att_text = $doc->createTextNode('maxwind'); $maxwind_att->appendChild($att_text); $doc->save("weather.xml"); } mysql_query($query, $link); mysql_close($link); } ?> Далее там же на сервере weather.js: var script = document.createElement('script'); script.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js'; document.getElementsByTagName('head')[0].appendChild(script); alert('script loaded'); $(document).ready(function () { $.ajax({ type: "GET", url: "weather.xml", dataType: "xml", success: xmlParser }); }); function xmlParser(xml) { $('#load').fadeOut(); $(xml).find("weather").each(function () { $(".main").append('<div class="day">' + $(this).find("day").text() + '</div><div class="month">' + $(this).find("month").text() + '</div><div class="year"> ' + $(this).find("year").text() + '</div>'); $(".weather").fadeIn(3000); }); } На стороне клиента вот такой html: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Weather Gadget by labitnangi-uo.ru</title> <script type="text/javascript" src="http://server.ru/weather.js"></script> <link rel="stylesheet" href="css/main.css" type="text/css" /> </head> <body class="body"> <g:background id="background" style="position:absolute;z-index:-1;top:0;left:0;" opacity="0"></g:background> <div id="gadgetContent"> <div class="main"></div> </div> </body> </html> Вопрос:
Подскажите плиз, что не так? :help: |
p.s.
Может быть есть какой нибудь более удобный способ парсинга? Буду рад любому способу. |
![]() The following will parse an XML string into an XML document in all major browsers, including Internet Explorer 6. Once you have that, you can use the usual DOM traversal methods/properties such as childNodes and getElementsByTagName() to get the nodes you want. var parseXml; if (typeof window.DOMParser != "undefined") { parseXml = function(xmlStr) { return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml"); }; } else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) { parseXml = function(xmlStr) { var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = "false"; xmlDoc.loadXML(xmlStr); return xmlDoc; }; } else { throw new Error("No XML parser found"); } Example usage: var xml = parseXml("<foo>Stuff</foo>"); alert(xml.documentElement.nodeName); If you're using jQuery, from version 1.5 you can use its built-in parseXML() method. var xml = $.parseXML("<foo>Stuff</foo>"); alert(xml.documentElement.nodeName); ![]() |
Thank you, now try
|
Часовой пояс GMT +3, время: 03:39. |