Модераторы: diadiavova

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из дерева XML, Многоуровневое дерево 
:(
    Опции темы
disketa
  Дата 15.10.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Подскажите пожалуйста и мне.

Есть файл xml с данными в нём содержаться данные, часть из которых надо выводить при определёном условии, делаю так:

For i = 0 To xml.getElementsByTagName("page").Length-1
if link.item(0).childNodes(i).getAttribute("url")="default.asp" then 
Response.write "Вывод данных..."
end if
next

Можно ли не перебором проверять на соответсвие условия, а сделать выборку xml с нужными условиеми?
PM MAIL   Вверх
diadiavova
Дата 15.10.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(disketa @  15.10.2011,  15:22 Найти цитируемый пост)
Можно ли не перебором проверять на соответсвие условия, а сделать выборку xml с нужными условиеми? 

Можно. XPath в твоем случае будет выглядеть примерно так
Код

//page[@url = 'default.asp']
Ну это если надо из всех элементов page в документе выбрать те, у который данный атрибут имеет соответствующее значение(более конкретно ты не написал).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
disketa
Дата 15.10.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Это с эканомит память, ну тоесть при этом будет загружаться не весь XML файл?
И можно этот код привести в рамках моего кода, а то я в XML почти не разбираюсь?

Это сообщение отредактировал(а) disketa - 15.10.2011, 17:51
PM MAIL   Вверх
diadiavova
Дата 15.10.2011, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(disketa @  15.10.2011,  18:50 Найти цитируемый пост)
Это с эканомит память, ну тоесть при этом будет загружаться не весь XML файл?

Это вряд ли, но поможет все записать одной строкой.
Цитата(disketa @  15.10.2011,  18:50 Найти цитируемый пост)
И можно этот код привести в рамках моего кода, а то я в XML почти не разбираюсь?

В рамках твоего кода не совсем понятно, что такое link.item(0) и что именно ты вибираешь. То есть, если это какой-то элемент документа и тебе надо выбрать его дочерние элементы page, то видим как-то так
Код

Dim pages 
Set pages = link.item(0).selectNodes("page[@url = 'default.asp']")

Если же речь о том, что надо получить все узлы-потомки с таким именем, то выражение приобретет вид
Код

Set pages = link.item(0).selectNodes(".//page[@url = 'default.asp']")

Таким образом ты получишь коллекцию узлов, удовлетворяющий условию. Но для того, чтобы вывести поочередно эту коллекцию в исходящий поток, тебе все равно понадобится цикл, так что в данном простейшем случае ты сэкономишь только на конструкции If.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
disketa
Дата 15.10.2011, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Приведу весь код:

Код

Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.setProperty "ServerHTTPRequest", true
xml.Load(server.mappath("list.xml"))
If xml.parseError.errorCode=0 Then
Set link = xml.getElementsByTagName("pages")
For i = 0 To xml.getElementsByTagName("page").Length-1
url=link.item(0).childNodes(i).getAttribute("url")
if url="default.asp" then 
Set ob = link.item(0).childNodes(i)
Set ob1 = ob.getElementsByTagName("link")
For j = 0 To ob1.Length-1 
u=ob1.item(j).childNodes(2).text
t=ob1.item(j).childNodes(1).text
Response.write u & "<br>" & t 
next
end if
next
end if


Данный код не всегда выполняется либо очень долго выполняется, файл xml около 10Мб, или серверу не хватает памяти, или пока он перебирает все значения (примерно 30000 записей), равные "default.asp" проходит времени больше чем разрешенно на хостинге.
Поэтому ищу способ оптимизации, если можно приведённый Вами код, вставьте в мой пожалуйста, всё равно не понял я как это сделать.


Это сообщение отредактировал(а) disketa - 15.10.2011, 18:28
PM MAIL   Вверх
disketa
Дата 15.10.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Если делаю так:

Код

Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.setProperty "ServerHTTPRequest", true
xml.Load(server.mappath("list.xml"))
If xml.parseError.errorCode=0 Then
Set link = xml.getElementsByTagName("pages")
Set ob = link.item(0).selectNodes(".//page[@url = 'default.asp']")
Set ob1 = ob.getElementsByTagName("link")
For j = 0 To ob1.Length-1 
u=ob1.item(j).childNodes(2).text
t=ob1.item(j).childNodes(1).text
Response.write u & "<br>" & t 
next
end if


Обрабатывается быстро теперь, но выводит первое значение из списка, причём где url не равно 'default.asp'
 smile 
Направление действий правельное, но условие видимо должно быть иное!
Расшифруйте пожалуйста эту строку: .//page[@url = 'default.asp']
что она обозначает, может она выбирает значение каторое не равно, но часть значения имеет строку 'default.asp' ?

Это сообщение отредактировал(а) disketa - 15.10.2011, 19:22
PM MAIL   Вверх
disketa
  Дата 15.10.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Всё проблему, решил (была ошибка в название параметров).
Спасибо большое, без Вас бы не разобрался с этим XML
PM MAIL   Вверх
diadiavova
Дата 15.10.2011, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Я не уверен, что все правильно понял, да VBscript знаю плохо, но вроде это то, что надо, по крайней мере суть такая, там уж если что сам поправь, гарантировать нормальную работу кода не могу.
Код

Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.setProperty "ServerHTTPRequest", true
xml.Load(server.mappath("list.xml"))
If xml.parseError.errorCode=0 Then
    Set links = xml.selectNodes("//pages//page[@url = 'default.asp']//link")
    Dim link
    For i = 0 To links.Length - 1
         Response.write links(i).childNodes(2).text & "<br>" & links(i).childNodes(1).text 
    Next
End If



Это сообщение отредактировал(а) diadiavova - 15.10.2011, 23:42


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
disketa
  Дата 16.10.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.5.2010

Репутация: нет
Всего: нет



Вот этот код заработал, как надо:

Код

Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.setProperty "ServerHTTPRequest", true
xml.Load(server.mappath("list.xml"))
If xml.parseError.errorCode=0 Then
Set link = xml.getElementsByTagName("pages")
Set ob = link.item(0).selectNodes(".//page[@url = 'default.asp']")
if ob.Length>0 then
Set ob1 = ob.item(0).getElementsByTagName("link") 'Вот здесь была ошибка!!!
For j = 0 To ob1.Length-1 
u=ob1.item(j).childNodes(2).text
t=ob1.item(j).childNodes(1).text
Response.write u & "<br>" & t 
next
end if
end if


Большое спасибо за помощь!

PM MAIL   Вверх
diadiavova
Дата 16.10.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(disketa @  16.10.2011,  12:08 Найти цитируемый пост)
Вот этот код заработал, как надо:

А почему не выбрать линки сразу, как у меня, ведь короче намного получается и код понятнее?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.1071 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.