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

Поиск:

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


Шустрый
*


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

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



Добрый день !
Пишу сейчас сайт на обычном ASP. Сайт будет привязан к файлу XML.
Подскажите пож-та, как мне получить следующий результат:
Код

<catalog>
    <Группа Код="111" Наименование="Имя1">
        <Группа Код="222" Наименование="Имя2">
            <Группа Код="333" Наименование="Имя3">
                <Группа Код="444" Наименование="Имя4">
                    <Группа Код="555" Наименование="Имя5">
...


Мне нужно получить список всех родительских групп, т.е. 

если Request("id") = 111, то нужно:
<A HREF='catalog.asp?id=111">Имя1</A>

если Request("id") = 333, то нужно:
<A HREF='catalog.asp?id=111">Имя1</A>
<A HREF='catalog.asp?id=222">Имя2</A>
<A HREF='catalog.asp?id=333">Имя3</A>

и т.д.
Я, признаться, с XML раньше не работал, поэтому и синтаксиса не знаю пока, и все эти шаблоны для меня в диковину. Может подскажет кто ресурс с примерами ? Желательно на русском ?
А вот, что я в файле asp пишу:

Код

Set xmlParser = CreateObject("Msxml2.DOMDocument")
xmlParser.async = False
xmlParser.load "C:\base.xml"
Set colNodes = xmlParser.selectNodes("//catalog/Группа[(@Код=" & Request("id") & "]")
For Each nodeNode In colNodes
    Response.Write "<A HREF='catalog.asp?id=" & nodeNode.attributes.getNamedItem("Код").Text & "'>" & nodeNode.attributes.getNamedItem("Наименование").Text & "</A>"
Next
Set xmlParser = Nothing


Направьте на путь, как говорится.
Большое спасибо.
С уважением, Сергей.
PM MAIL   Вверх
diadiavova
Дата 22.7.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Справочник здесь
http://msdn.microsoft.com/ru-ru/library/ms256177.aspx
А нужное тебе выражение здесь
Код

ancestor::*



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


Шустрый
*


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

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



Спасибо за указанный вектор.
Справочник настолько обширный, но поиск по ancestor уводит меня либо на SQL Server, либо на Visual Studio.
Я вижу - Вы хорошо владеете материалом. Не могли бы помочь конкретным примером ? Как в моем случае надо писать ?

Буду премного благодарен.
С уважением, Сергей.
PM MAIL   Вверх
Zloxa
Дата 23.7.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Код

//Группа[@Код = 333]/ancestor-or-self::Группа

вместо
Код

//catalog/Группа[(@Код=" & Request("id") & "]"


user posted image

Это сообщение отредактировал(а) Zloxa - 23.7.2010, 09:54


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
svch
Дата 23.7.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот, что получаю:
Expected token 'eof' found ':'. //Группа[@Код=333]/ancestor-or-self-->

Это сообщение отредактировал(а) svch - 23.7.2010, 11:32
PM MAIL   Вверх
diadiavova
Дата 23.7.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(svch @  23.7.2010,  10:31 Найти цитируемый пост)
Справочник настолько обширный

В этом справочнике слева есть панель навигации и я дал ссылку на корневой узел справочника. В частности справка по осям здесь
http://msdn.microsoft.com/ru-ru/library/ms256456.aspx
Цитата(svch @  23.7.2010,  10:31 Найти цитируемый пост)
Как в моем случае надо писать ?

В ситуации, когда из хмл-файла надо извлечь данные и построить из них какой-то документ, лучше воспользоваться XSLT. Пример программного преобразования здесь
http://msdn.microsoft.com/en-us/library/ms762796(VS.85).aspx
Чтобы получить ссылку из группы, понадобится такой шаблон
Код

    <xsl:template match="Группа">
        <a href="{concat('catalog.asp?id=', @Код)}">
            <xsl:value-of select="@Наименование"/>
        </a>
    </xsl:template>

А там, где для конкретного узла надо вставить список ссылок, построенный из родительских групп просто написать
Код

<xsl:apply-templates select="ancestor::Группа"/>

Если решишь оставить как есть, то 4-ю строку кода напиши так
Код

Set colNodes = xmlParser.selectNodes("//catalog/Группа[(@Код=" & Request("id") & "]/ancestor::Код")

Если я правильно понял смысл кода ессно

Это сообщение отредактировал(а) diadiavova - 23.7.2010, 11:54


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


Шустрый
*


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

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



Нет, та же самая ошибка. Вы там, кстати, скобку забыли.
Код

Expected token 'eof' found ':'. //catalog/


XML у меня вот такой :
Код

<?xml version="1.0" encoding="windows-1251"?>
<catalog>
    <Группа Код="000002" Наименование="Имя1">
        <Группа Код="000180" Наименование="Имя2">
            <Элемент Код="309151">
                <Характеристики Вес="" Высота=""/>
            </Элемент>
            <Элемент Код="309155">
                <Характеристики Вес="" Высота=""/>
            </Элемент>
            <Элемент Код="310021">
                <Характеристики Вес="" Высота=""/>
            </Элемент>
            <Элемент Код="310027">
                <Характеристики Вес="" Высота=""/>
            </Элемент>
        </Группа>
        <Группа Код="000008" Наименование="Имя3">
            <Группа Код="000856" Наименование="Имя4">
                <Элемент Код="52652">
                    <Характеристики Вес="" Высота=""/>
                </Элемент>
            </Группа>
        </Группа>
...

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


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


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

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



Цитата(svch @  23.7.2010,  13:06 Найти цитируемый пост)
Нет, та же самая ошибка.

А так?
Код

        Set colNodes = xmlParser.selectNodes("//catalog/Группа[@Код='" & Request("id") & "']/ancestor::Группа")




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


Шустрый
*


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

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



То же самое :(
PM MAIL   Вверх
Zloxa
Дата 23.7.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Цитата(diadiavova @  23.7.2010,  12:15 Найти цитируемый пост)
//catalog/Группа

сматчит только группы первого уровня, нужно "//Группа"
Цитата(diadiavova @  23.7.2010,  12:15 Найти цитируемый пост)
ancestor

не захватит искомый элемент, надо ancestor-or-self

но судя по
Цитата(svch @  23.7.2010,  11:32 Найти цитируемый пост)
Expected token 'eof' found ':'.

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 23.7.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Код

Sub xmltest()
  Debug.Print "------------------------- start"
  Set xmlParser = CreateObject("Msxml2.DOMDocument")
  xmlParser.async = False
  xmlParser.LoadXML ("<catalog><Группа Код=""111""><Группа Код=""222""><Группа Код=""333""><Группа Код=""444""></Группа></Группа></Группа></Группа></catalog>")
  Debug.Print "parsed with error:" & xmlParser.parseError.reason
  xmlParser.setProperty "SelectionLanguage", "XPath"
  Set colNodes = xmlParser.SelectNodes("//Группа[@Код = 222]/ancestor-or-self::Группа")
  For Each nodeNode In colNodes
     Debug.Print nodeNode.Attributes.getNamedItem("Код").Text
  Next
  Set xmlParser = Nothing
  Debug.Print "------------------------- finsih"
End Sub

------------------------- start
parsed with error:
111
222
------------------------- finsih



Это сообщение отредактировал(а) Zloxa - 23.7.2010, 12:56


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
svch
Дата 23.7.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо Вам !
Код

xmlParser.setProperty "SelectionLanguage", "XPath"


Без этой строки не работало.
А если необходимо сделать обратный вариант ?
Т.е.
Код

<catalog>
    <Группа Код="111" Наименование="Имя1">
        <Группа Код="222" Наименование="Имя2">
            <Группа Код="333" Наименование="Имя3">
                <Группа Код="444" Наименование="Имя4">
                    <Группа Код="555" Наименование="Имя5">
...

если Request("id") = 111, то нужно получить все вложенные Группы:
<A HREF='catalog.asp?id=111">Имя1</A>
<A HREF='catalog.asp?id=222">Имя2</A>
<A HREF='catalog.asp?id=333">Имя3</A>
<A HREF='catalog.asp?id=444">Имя4</A>
<A HREF='catalog.asp?id=555">Имя5</A>

С уважением, Сергей.


PM MAIL   Вверх
Zloxa
Дата 23.7.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Цитата(svch @  23.7.2010,  13:13 Найти цитируемый пост)
А если необходимо сделать обратный вариант ?

Код

//Группа[@Код = ???]/descendant-or-self::Группа



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
svch
Дата 23.7.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот спасибо, добрый человек !
Что почитать мне лучше ? Тут же не справочник нужен, а чтоб разжевали по полочкам.

С уважением, Сергей.
PM MAIL   Вверх
Zloxa
Дата 23.7.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Цитата(svch @  23.7.2010,  15:16 Найти цитируемый пост)
Что почитать мне лучше ?

Мне, в свое время показался весьма неплохим ресурс.
В частнеости там об XPath

Это сообщение отредактировал(а) Zloxa - 23.7.2010, 15:38


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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