Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прочитать XML-файл локально (https://javascript.ru/forum/misc/28756-prochitat-xml-fajjl-lokalno.html)

oyaebunterkrah 01.06.2012 15:29

Прочитать XML-файл локально
 
Всем привет. Есть задача загрузить xml, чтобы в дальнейшем распарсить его, но так, чтобы это было кроссбраузерно, и чтоб браузеры не ругались. пробовал так:

$(document).ready(function()
{
  $.ajax({
    type: "GET",
    url: "jquery_xml.xml",
    dataType: "xml",
    success: parseXml
  });
});


но Chrome, например, ругается (нужно запускать с ключом --allow-file-access-from-files).

Ну и вообще, как бы вы решали данную задачу, с учётом, что это должно уметься делаться локально, т.е.: человек скачивает архив, в архиве не должно быть никаких, exe'шников...

B@rmaley.e><e 01.06.2012 15:31

Если человек что-то скачал и может это запустить, зачем использовать HTML + JS? Можно и .exe'шник приложить.
С другой стороны, зачем человеку скачивать то, что он всё равно в браузере откроет?

Насколько мне известно, нет нормальных и кроссбраузерных способов работы с локальной ФС.

oyaebunterkrah 01.06.2012 15:32

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 177947)
Если человек что-то скачал и может это запустить, зачем использовать HTML + JS? Можно и .exe'шник приложить.

Человек будет это запускать в банке. Там не разрешают)
Требование, чтоб и локально было, и удалённо.

B@rmaley.e><e 01.06.2012 15:33

Попробуйте FileAPI. Не обещаю, что поможет, но вдруг.

Deff 01.06.2012 15:34

oyaebunterkrah,
Вродь на хабре была статья, как локально работать с браузером

Поищу - Вот, http://habrahabr.ru/post/138054/

вродь были и еще хабр статьи подобных реализаций

Deff 01.06.2012 16:09

Цитата:

Сообщение от oyaebunterkrah
Человек будет это запускать в банке. Там не разрешают)
Требование, чтоб и локально было, и удалённо.

Не оч понял про экзешники,

Но мой опыт работы в Опере, Произвольно сложный контент страницы

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

oyaebunterkrah 01.06.2012 16:13

Цитата:

Сообщение от Deff (Сообщение 177971)
Не оч понял про экзешники,

Но мой опыт работы в Опере, Произвольно сложный контент страницы

Давим - Файл - Сохранить как - С изображениями, кидаем в папку с англоязычным названием - открывается во всех браузерах, можно и удалённо

В общем, нужно сделать страничку на которой куча контролов, с помощью которых пользователь определяет критерии, по которым будет производиться выборка из файла xml. Т.е., на форме он с помощью DropDownList'ов выбирает нужные значения, затем давит НАЙТИ, и из xml файла должны выбраться соответствующие записи и отрендериться на страницу в прилежном виде. Как лучше всего это сделать? Какие есть варианты, куда копать?

Deff 01.06.2012 16:24

oyaebunterkrah,
По-моему нун сначало определицо с системой взаимодействия Локального Хоста и удаленного,
Наиболее короткий по реализации метод,
Взаимодействовие Пользователя всегда с локальным хостом,
А отдельный интерфейс: проверка новизны XML страницы от сервера и добавок в XML контента пользователей и переобновление данной локальной страницы

Либо забить пока на локал, *но на ином этапе подключить локальный Вариант сложнее

oyaebunterkrah 01.06.2012 16:59

Цитата:

Сообщение от Deff (Сообщение 177976)
oyaebunterkrah,
По-моему нун сначало определицо с системой взаимодействия Локального Хоста и удаленного,
Наиболее короткий по реализации метод,
Взаимодействовие Пользователя всегда с локальным хостом,
А отдельный интерфейс: проверка новизны XML страницы от сервера и добавок в XML контента пользователей и переобновление данной локальной страницы

Либо забить пока на локал, *но на ином этапе подключить локальный Вариант сложнее

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

Deff 01.06.2012 17:59

oyaebunterkrah,
Объём XML страницы/страниц примерн известен ?

oyaebunterkrah 01.06.2012 19:37

Да, максимум 500-600 строк.

Deff 02.06.2012 00:57

oyaebunterkrah,
Собственно посколь завис пока на window.name - пробуйте использовать сохранение в нём...

В отличие от куков, не страдает от очистки кеша

А распарсить текст достаточно просто, главное иметь текст страницы

FINoM 02.06.2012 01:20

Можно попробовать вставить iframe с этим xml файлом и получить содержимое.
(Кстати, почему аякс распространился тогда, когда появился XHR? Можно было ведь делать тупо на айфрейме.)

Deff 02.06.2012 01:37

Цитата:

Сообщение от FINoM
Можно попробовать вставить iframe с этим xml файлом и получить содержимое.

FINoM,
Парс в jQuery две строки, хотя нун на код глянуть

oyaebunterkrah 02.06.2012 16:54

решил хранить структурированный xml в каком-нибудь тэге прям в html, например:

<p id="data">
	<?xml version="1.0" encoding="utf-8" ?>
	<RecentTutorials>
		<Tutorial author="The Reddest">
			<Title>Silverlight and the Netflix API</Title>
			<Categories>
				<Category>Tutorials</Category>
				<Category>Silverlight 2.0</Category>
				<Category>Silverlight</Category>
				<Category>C#</Category>
				<Category>XAML</Category>
			</Categories>
			<Date>1/13/2009</Date>
		</Tutorial>
	</RecentTutorials>
</p>


а потом делать:

var xmlData = $(#data).html();
var xmlDOM = $.parseXML(xmlData);
$(xmlDOM).find(...);

но, команда $(#data).html() почему-то ломает структуру xml, после чего $(xmlDOM).find(...) ничего не может найти.

а вот если делать так:

var xmlString = '<?xml version="1.0" encoding="utf-8" ?> <RecentTutorials> <Tutorial author="The Reddest"> <Title>Silverlight and the Netflix API</Title> <Categories> <Category>Tutorials</Category> <Category>Silverlight 2.0</Category> <Category>Silverlight</Category> <Category>C#</Category> <Category>XAML</Category> </Categories> <Date>1/13/2010</Date> </Tutorial> <Tutorial author="The Hairiest"> <Title>Cake PHP 4 - Saving and Validating Data</Title> <Categories> <Category>Tutorials</Category> <Category>CakePHP</Category> <Category>PHP</Category> </Categories> <Date>1/12/2009</Date> </Tutorial> <Tutorial author="The Tallest"> <Title>Silverlight 2 - Using initParams</Title> <Categories> <Category>Tutorials</Category> <Category>Silverlight 2.0</Category> <Category>Silverlight</Category> <Category>C#</Category> <Category>HTML</Category> </Categories> <Date>1/6/2009</Date> </Tutorial> <Tutorial author="The Fattest"> <Title>Controlling iTunes with AutoHotkey</Title> <Categories> <Category>Tutorials</Category> <Category>AutoHotkey</Category> </Categories> <Date>12/12/2008</Date> </Tutorial> </RecentTutorials>';

var xmlDOM = $.parseXML(xmlString );

т.е. запихнуть всё в одну строку без пробелов и табуляций, то парсится всё нормально, и поиск работает.

хотелось бы узнать, насколько логично так делать, и, если это приемлемый вариант, то каким образом можно получить содержимое тэга <p> и убрать из него все пробелы и табуляции, для дальнейшей обработки?

Deff 02.06.2012 17:27

oyaebunterkrah,
Обычно трюк такой:
<div id=Storage></div>


<script type="text/javascript">
var Data='\n\
	<?xml version="1.0" encoding="utf-8" ?>\n\
	<RecentTutorials>\n\
		<Tutorial author="The Reddest">\n\
			<Title>Silverlight and the Netflix API</Title>\n\
			<Categories>\n\
				<Category>Tutorials</Category>\n\
				<Category>Silverlight 2.0</Category>\n\
				<Category>Silverlight</Category>\n\
				<Category>C#</Category>\n\
				<Category>XAML</Category>\n\
			</Categories>\n\
			<Date>1/13/2009</Date>\n\
		</Tutorial>\n\
';

*!*
var Storage=$("#Storage").remove()
Storage.html(Data);
*/!*
alert(Storage.html())
</script>

oyaebunterkrah 02.06.2012 18:13

а что даёт "\n\"?

Deff 02.06.2012 18:17

oyaebunterkrah,
Да это не обязательно - Вы же Data подгружаете - а я запихнул её в строковую переменную

Эт перевод строки и указание на неразрывность строки

Deff 02.06.2012 18:26

oyaebunterkrah,
В принципе аналогичную методу можно проделать и с открытием модального окна и запихиванием туда кода:
popup1 = window.open("","popData","height=1,width=1")
popup1.document.write(Data)
popup1.document.close()
C последующим считыванием

oyaebunterkrah 02.06.2012 19:53

ну ок. а не подскажешь, как можно работать со считанным xml? я имею в виду добавлять, удалять, редактировать узлы..? может, библиотечка есть уже какая..?

Deff 02.06.2012 20:20

Цитата:

Сообщение от oyaebunterkrah
ну ок. а не подскажешь, как можно работать со считанным xml? я имею в виду добавлять, удалять, редактировать узлы.

Ну в Новых браузерах работаешь нормально на jQuery

В Ие 6-7 - не наю(а может и 8
Но вроде компутер банковский (или произвольный ?

<div id=Storage></div>


<script type="text/javascript">
var Data='\n\
	<?xml version="1.0" encoding="utf-8" ?>\n\
	<RecentTutorials>\n\
		<Tutorial author="The Reddest">\n\
			<Title>Silverlight and the Netflix API</Title>\n\
			<Categories>\n\
				<Category>Tutorials</Category>\n\
				<Category>Silverlight 2.0</Category>\n\
				<Category>Silverlight</Category>\n\
				<Category>C#</Category>\n\
				<Category>XAML</Category>\n\
			</Categories>\n\
			<Date>1/13/2009</Date>\n\
		</Tutorial>\n\
';

var Storage=$("#Storage").remove()
Storage.html(Data);
*!*
Storage.find("Category:first").append(" Добавка")
Storage.find("Category").each(function (){
 alert($(this).html())
});
*/!*

</script>

Arris 03.06.2012 07:57

Можно покопать в сторону TiddlyWiki, у них в коде описана технология загрузки данных из локального файла. Но там есть нюансы - используемая технология не позволяет работать с русскими буквами (поддерживается, кажется, только 1250 кодировка, поэтому данные там кодируют... )

oyaebunterkrah 03.06.2012 15:02

Цитата:

Но вроде компутер банковский (или произвольный ?

ага, банковский.

чё-т когда делаю так, как ты написал:
Storage.find("Category:first").append(" Добавка");
Storage.find("Category").each(function (){alert($(this).html()});

вылетает jquery. а если меняю $(this).html() на $(this).text(), то всё ок.

Deff 03.06.2012 15:06

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

Ксать еcли банковский - мож стоит установить Silverlight 2.0 (Ток браузер не Опера, траблы там с оным, зато ИЕ поддержано)

и не мучацо ?

oyaebunterkrah 03.06.2012 15:08

Цитата:

Сообщение от Deff (Сообщение 178463)
oyaebunterkrah,
Ну наверно техт правильнее...
Вас Долго не было - задачка затухла

Ксать еcли банковский - мож стоит установить Silverlight 2.0

и не мучацо ?

я бы рад) но не станешь же каждому пропихивать framework сильверлайтовский.. тем более, что в банке не дадут установить. а как тему оживить можно?)

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

Deff 03.06.2012 15:11

Цитата:

Сообщение от oyaebunterkrah
блин, ну должны же быть прозрачные методы добавления, удаления, редактирования...

А что - у Вас на jQuery не добавляецо ?
append() remove() replaceWith();?
И потом - Куда вы в итоге хотите деть отредактированную страницу и вообще - зачем она нужна ?

oyaebunterkrah 03.06.2012 15:30

Цитата:

Сообщение от Deff (Сообщение 178466)
А что - у Вас на jQuery не добавляецо ?
append() remove() replaceWith();?
И потом - Куда вы в итоге хотите деть отредактированную страницу и вообще - зачем она нужна ?

будет два варианта одного функционала: локальный и серверный. в серверном всё понятно: данные хранятся в отдельном файле xml; там же (на серверном варианте) будет возможность добавления, удаления, редактирования записей. а для локальной данные будут храниться в теле html, так как другого нормального способа я не нашёл.

Deff 03.06.2012 15:32

Ну как её оживить, если ответы как с КВЖД (Китайско-Восточная железная дорога )
посколь ежели jQuery не идёт нун поискать другой способ...

oyaebunterkrah 03.06.2012 15:35

Цитата:

Сообщение от Deff (Сообщение 178470)
Ну как её оживить, если ответы как с КВЖД (Китайско-Восточная железная дорога )
посколь ежели jQuery не идёт нун поискать другой способ...

)) буду пытаться через jQuery. подводя итоги, для этих дел служат методы append() remove() replaceWith();?

Deff 03.06.2012 15:37

Цитата:

Сообщение от oyaebunterkrah
а для локальной данные будут храниться в теле html,

А чем window.name - устроило ???

window.name="str"
Cтрока может быть до двух мегов

window.name подгружаете единожды, основная задача - работать с базой на одной вкладке, посколь переменная лишь для вкладки

Deff 03.06.2012 15:39

Цитата:

Сообщение от oyaebunterkrah
для этих дел служат методы append() remove() replaceWith();?

oyaebunterkrah,
Все методы jQuery работы с тегами в новых браузерах - вродь должны работать

Просто привёл сходу типовые,
наверно должно и работа с классом поддерживаться - актуально для идентичных тегов (хотя легко обойти более длинным кодом-перебора

oyaebunterkrah 03.06.2012 15:40

а какая разница хранить в обычной переменной, которая будет инициализироваться на $(document).ready или в windows.name?

Deff 03.06.2012 15:44

oyaebunterkrah,
Вы её теряете при закрытии браузера, или смены страницы - тут она сохраняется и при выключении машины

*Хотя - возможно, в целях безопасности Вам это как раз и надо не сохранение данных -ни наю

ограничение одно - вкладка должна быть той же... но подгрузка - будет реже

oyaebunterkrah 03.06.2012 15:47

для локальной версии не критично, так как всё будет на одной стр. происходить. а вообще буду иметь в виду, спасибо.

Цитата:

тут она сохраняется и при выключении машины
а как это получается?

Deff 03.06.2012 15:49

oyaebunterkrah,
Окна вкладок сохраняются в файл в браузерах

oyaebunterkrah 03.06.2012 15:53

ясно, спасибо! а сам вообще на чём по большей части прогаешь?

Deff 03.06.2012 16:58

Цитата:

Сообщение от oyaebunterkrah
чё-т когда делаю так, как ты написал:
Storage.find("Category:first").append(" Добавка");Storage.find("Category").each(fun ction (){alert($(this).html()});
вылетает jquery. а если меняю $(this).html() на $(this).text(), то всё ок.



Проверил во всех браузерах (Кроме ИЕ)- у меня в норме
http://hostjs-mybb2011.narod.ru/oyaebunterkrah2.htm

oyaebunterkrah 03.06.2012 17:06

Цитата:

Сообщение от Deff (Сообщение 178490)
Проверил во всех браузерах (Кроме ИЕ)- у меня в норме
http://hostjs-mybb2011.narod.ru/oyaebunterkrah2.htm

ок! у меня тож отработало!


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