Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   парсер xml на js (https://javascript.ru/forum/misc/72828-parser-xml-na-js.html)

Vlad777 01.03.2018 12:58

парсер xml на js
 
Помогите добить парсер xml на js новичку.
есть xml -
Код:

<calendar>
<title/>
<year index="2018">
<month name="january">
<day num="1" type="holiday">
<![CDATA[ ]]>
</day>
<day num="2" type="holiday">
<![CDATA[ ]]>
</day>
<day num="3" type="holiday">
<![CDATA[ ]]>
</day>
<day num="4" type="holiday">
<![CDATA[ ]]>
</day>
<day num="5" type="holiday">
<![CDATA[ ]]>
</day>
<day num="6" type="plain">
<![CDATA[ ]]>
</day>
<day num="7" type="plain">
<![CDATA[ ]]>
</day>
<day num="8" type="holiday">
<![CDATA[ ]]>
</day>
<day num="9" type="event">
<![CDATA[
<p >some data.....</p>
]]>
</day>

есть парсер -
if (window.XMLHttpRequest) {
  xmlhttp=new XMLHttpRequest();
  } else {
	xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.open("GET","nalog_calendar.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;

тут как бы все понятно, что нужно в соответствии с месяцем и днем взять из дерева данные и вставить в дом..... но вот в том то и загвоздка, что как новичок не могу пройти по этому xml дереву - ни getElementsByTagName("month")[0].childNodes[0].nodeValue;
ни getElementsByTagName("day")[3].getAttribute("15"); - ничего не идет.... просьба прежде чем ногами пинать, дать адекватный ответ. лучше с примером, чтобы не так обидно было :-)

ruslan_mart 01.03.2018 13:22

var xmlhttp = new XMLHttpRequest();
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("GET", "nalog_calendar.xml", true);
xmlhttp.onloadend = function() {
   var doc = document.createElement("div");
   doc.innerHTML = this.responseText;

   console.log(doc.getElementsByTagName("day")[3].getAttribute("15"));
};
xmlhttp.send();

Vlad777 01.03.2018 13:29

нет...... так тоже ничего не дает.....

ruslan_mart 01.03.2018 22:05

Vlad777, ой, забыл вторую строку стереть. Она не нужна.
Ну и важно понимать, что делает getAttribute('15').

Vlad777 02.03.2018 10:30

Ruslan, 2 строка не работает, это и так было понятно, т.к. такую конструкцию обычно через if пишут, во-вторых, вы изменили синхрон.способ передачи данных на асинхронный, но на обход xml дерева это не как не сказывается. Мне нужна помощь в та ом, чтобы при определении месяца и даты текущего дня достучаться до значения в блоке cdata - соответствующее текущей даты. Обход по самому дереву рекурсией я сделал, но толку тоже мало..... так как выдергиваются все значения в cdata а мне нужно на текущую..... вот тут и застрял. Если кто может или знает как, помогите плиз.

Dilettante_Pro 02.03.2018 11:31

Пример перебора
var responseText = '<calendar><title/><year index="2018"/><month name="january"/><day num="1" type="holiday"><![CDATA[ ]]></day><day num="2" type="holiday"><![CDATA[ ]]></day><day num="3" type="holiday"><![CDATA[ ]]></day><day num="4" type="holiday"><![CDATA[ ]]></day><day num="5" type="holiday"><![CDATA[ ]]></day><day num="6" type="plain"><![CDATA[ ]]></day><day num="7" type="plain"><![CDATA[ ]]></day><day num="8" type="holiday"><![CDATA[ ]]></day><day num="9" type="event"><![CDATA[<p >some data.....</p>]]></day></calendar>';

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");
}
var xml = parseXml(responseText);
var dayList = xml.getElementsByTagName("day");
for (var i = 0; i < dayList.length; i++) {
   console.log(dayList[i].getAttribute("type"));
   
}

laimas 02.03.2018 11:53

Dilettante_Pro, ActiveXObject из под браузера не получится, и только ишак поддерживает.

Dilettante_Pro 02.03.2018 14:33

laimas,
Я смотрю в Хроме - и все работает.
Обратите внимание на строки 5-8

laimas 02.03.2018 14:45

Цитата:

Сообщение от Dilettante_Pro
Обратите внимание на строки 5-8

А я ActiveXObject.

Dilettante_Pro 02.03.2018 15:08

laimas,
Цитата:

Сообщение от laimas
А я ActiveXObject.

Что-то я вас не понимаю...
ActiveXObject используется по условию.
Проверил - работает в Хроме, ИЕ, Опера

laimas 02.03.2018 15:27

Цитата:

Сообщение от Dilettante_Pro
Что-то я вас не понимаю...

В IE, для которого ActiveX компоненты родная стихия, их использование в сценариях на веб страницах по умолчанию запрещено. Они могут представлять серьезную опасность.

В других браузерах их поддержка вообще только через расширения.

Dilettante_Pro 02.03.2018 15:33

laimas,
Цитата:

Сообщение от laimas
В других браузерах их поддержка вообще только через расширения.

Никто и не собирается запускать ActiveX в других браузерах.

laimas 02.03.2018 15:35

Цитата:

Сообщение от Dilettante_Pro
Никто и не собирается запускать ActiveX в других браузерах.

Так и IE тоже матерится будет. :) Зачем же его вообще упоминать?

Vlad777 02.03.2018 15:53

Dilettante_Pro, спасибо огромное за помощь! Я сейчас благодаря вам могу через getAttribute("num") достучаться до чисел месяца, дальше думаю.....надеюсь..... сам справлюсь. +1 в карму!
что касается подхода парсинга самого xml я использую вот такую функцию -
Код:

function parseXML(dname) {
        var xmlDoc;
        if (window.ActiveXObject) {
                xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                xmlDoc.async = false;
                xmlDoc.load(dname);
                return xmlDoc;
        } else if (window.XMLHttpRequest) {
                xmlDoc = new window.XMLHttpRequest();
                xmlDoc.open("GET", dname, false);
                xmlDoc.send("");
                return xmlDoc.responseXML;
        }
}


Vlad777 02.03.2018 16:01

Что касается ActiveX. тут я наверно с laimas соглашусь, что все ослики до 10 блокируют его по умолчанию и спрашивают разрешение на запуск. Но честно говоря, когда пишешь код сам с нуля, то все понятно. а когда например как я 80% времени копипастлю , то это рассматриваю как небольшое оправдание самого себя - вот типа и о них (я про старых осликов) забочусь. НО есть сервисы, которые заточены ТОЛЬКО на приход и работу осликов, и вот тут без такой конструкции ну ни как.
Так что вы оба правы и оба не правы по поводу ActiveX.

laimas 02.03.2018 16:03

Цитата:

Сообщение от Vlad777
что все ослики до 10 блокируют его по умолчанию

Все будут блокировать, если запрос из под веб страницы. Переименуйте html страницу в .hta, добавьте в нее заголовок HTA приложения, сохраните локально, и будет приложение. И уже никакой ругани.

Vlad777 02.03.2018 16:14

Цитата:

Сообщение от laimas (Сообщение 479592)
Все будут блокировать, если запрос из под веб страницы. Переименуйте html страницу в .hta, добавьте в нее заголовок HTA приложения, сохраните локально, и будет приложение. И уже никакой ругани.

laimas, мы сейчас говорим о конкретной веб-разработке или просто пытаемся принципиально всем доказать, что упоминание ActiveX useless?
Переименуйте html страницу в .hta и пишите все сайты с этим расширением - это не есть гуд в реали. Если вам принципиально чтобы ваше мнение разделили (поддержали) - я уже написал, что для каждой задачи свои орудия решения. Если вы не сталкивались с определенными сервисами где все заточено только на осликов ... ну жизнь долгая и у вас все еще впереди.

И давайте уж чтобы тему ActiveX раз и навсегда - я вам +1 в карму тоже - и на этом закончим. Мне так-то важнее свой календарь спарсисть корректно и вывести событие в зависимости от текущей даты, а мелочи жизни сами отпадут......наверно....надеюс ь

laimas 02.03.2018 16:18

Цитата:

Сообщение от Vlad777
мы сейчас говорим о конкретной веб-разработке или просто пытаемся принципиально всем доказать

Ничего и никому не доказывается, а просто говорится о том, что из под веб страницы ActiveX любой ишак заблокирует. Какой же смысл их упоминать в коде? А вот вне веб страницы пожалуйста.

Вот и весь смысл сказанного, все иное это уже ваши домыслы. )

Vlad777 02.03.2018 16:21

laimas, вот по теме топика от вас ниодной строчки кода помощи, зато разбор вашего мнения занял уже 30 минут моего бесценного..... начинаю жалеть что плюсанул вам в карму....

laimas 02.03.2018 16:24

Vlad777,
я упомянул о ActiveX в коде не для вас, а для автора кода. Странно их вообще видеть в коде для веб. Далее, это уже ваша инициатива и "жалобы" на ... не принимаются.

Vlad777 02.03.2018 16:38

laimas,
анализ ваших высказываний в теме и на форуме в частности, позволяет сделать вывод , что вам не больше 21 года, неженат и нет детей. Спорить с таким багажом за плечами как у вас бесполезно, вы все равно останетесь при своем мнении....пока.... как я говорил жизнь долгая, глядишь чему-нибудь научит и странности перестанут быть странными. Удачи вам!

laimas 02.03.2018 16:41

Цитата:

Сообщение от Vlad777
анализ ваших высказываний в теме и на форуме в частности, позволяет сделать вывод , что вам не больше 21 года, неженат и нет детей.

Ну понесло очередного обиженного бог знает чем... Не не надо делать выводов, а тем более в корне неверных.


Часовой пояс GMT +3, время: 18:40.