XML сылка на элемент

rid2000

Такое бывает?
Мне сказали, что есть на подобие того... Но я не могу найти инфу пока... может поможете...
Если такое есть, то как это записать в схеме?...
Я ща ищу инфу, нужна срочно. Если поможете в поиске, буду примного благодарен

rid2000

Т.е.. Я поясню:
У нас есть, например, типы объектов. Я их описываю в XML документе. Как вы знаете, типы различаются именами (внешне). Т.е.
<Type name="lala">
...
</Type>
<Type name="baba">
...
</Type>
...
Потом мне надо описать объекты:
<Object name="babaObj" typeOf="baba"/>
В этом примере я в атрибуте typeOf пишу просто имя типа. Потом мне самому надо будет искать тип по имени.
Но мне посоветовал один чел, и сказал, что в XML есть подобие ссылок. Т.е. я могу сделать сразу ссылку на элемент Type.

ppplva

Наверное, это XPath и XLink, почитай на www.w3c.org

sergei1969

м.б. href ?

6yrop

я не очень понял что именно тебе надо, из того что я понял, вот:
Потом мне самому надо будет искать тип по имени.

что значит самому искать? вот так

selectSingleNode("//baba")


сложно?

durka82

Вот статья на эту тему.

rid2000

что значит самому искать? вот так

Сорри, я имел ввиду, что надо искать (вообще)...
А слышал, что в XML поддерживает ссылки...

bastii

а ты не думал использовать XSLT вместо трансформационной схемы?

rid2000

Надо посмотреть, на XSLT я еще не обращал внимание...
Хотя были предложения...
Посмотрю..
Тока по функциональности, мне же не надо хмл преобразовывать... А запрос...

6yrop

Ты сам то понимаешь, что тебе нужно?
Если задавать такие не ясные вопросы, то народ и будет тебе говорить всё, что сам об XML слышал типа XSLT, XLink, XPath и т.д.
Если хочешь узнать весь список технологий XML проще зайти на www.w3c.org
В этом примере я в атрибуте typeOf пишу просто имя типа. Потом мне самому надо будет искать тип по имени.
Адрес документа и XPath-путь внутри документа вполне достаточно, чтобы найти элемент и для этого достаточно одной команды, которую я написал. Если ты хочешь неуникальные имена для типов, тогда просто XPth-путь будет другой.

freezer

на самом деле XML поддерживает ссылки, только не помню как

6yrop

поддерживает ссылки

что это значит?

rid2000

Спасибо за советы... Давай не будешь развращать тред пожалуйста...
На примере видно о чем я. Если хочешь повторю, но отвечать на мой пост не обязательно...
Команду которую ты написал - команда поиска, т.е. надо включать поиск !
А я спрашиваю про ССЫЛКИ ! с использованием, которых не НАДО ПОИСКА !
selectSingleNode("//baba")

Ты сам же видишь, что это ПОИСК ПО ИМЕНИ ! КАКАЯ РАЗНИЦА - РЕАЛИЗОВАННО ЛИ ЭТО ГДЕ-ТО ИЛИ НАПИСАННО РУКАМИ (В ОБЩИХ ЧЕРТАХ)
ЗЫ: ПОЖАЛУЙСТА, не надо тут левый базар устраивать !

freezer

я был не совсем точен, не XML, а DTD.
можно указать, что такой-то атрибут должен быть ссылкой на id другого элемента

rid2000

А - он со мной работает в проекте, поэтому он упомянул чуток другую вещь, которая мне тоже нужна, но не тут

6yrop

это всего лишь проверка целостности данных

freezer

я в курсе. Просто обрывок информыции в памяти всплыл, ща вот в мсдн уточнил.

rid2000

ID - это ID - там надо метить, а потом на него ссылаться...
А моя "проблема", как если у меня есть Object как я могу присобачить ссылку так чтобы за "одну операцию" получить Node типа

freezer

в твоем случае id - это значение атрибута name

6yrop

в чем проблема, я же написал, имя берешь из значения атрибута

rid2000

Давай допустим, у ТИПА нет имени даже...

6yrop

тогда в атрибуте typeOf указываешь XPath-путь к нему (я об этом уже намекал)

freezer

гы... и как ты на него ссылаться собираешься?

rid2000

Ну ты описываешь, то что я уже использую.
Т.е. описание объекта выглядет так:
<Object name="babaObj" typeOf="baba"/>
Потом я делаю:
selectSingleNode("//baba")
И получаю Ноде ТИПА...
Но я подразумеваю, что в описании ОБЪЕКТА должно быть типа:
<Object name="babaObj" typeOf=LINK>, какая-та ссылка...
И потом типа:
getNode(LINK)

rid2000

В том-то и вопрос состоит и СПРАШИВАЕТСЯ:
Есть ли такое?

freezer

да, вариант. Но тогда без скриптинга не обойтись, и DTD, наверное, хрен сделаешь.
Кстати, в XSLT можно XPath брать из атрибута?

6yrop

зачем скрипт?
DTD устарели, и зачем они здесь?
над вторым вопросом сейчас подумаю

6yrop

с учетом того, что может указываться не имя, а XPath-путь, я не вижу разницы

rid2000

ВОТ БОЛЕЕ ТОЧНЫЙ ПРИМЕР.
Раздел описания типа. Внутри типов находятся различные данные
<Type>
...
</Type>
<Type>
...
</Type>
<Type>
...
</Type>
...
<Object name="Obj" typeOf=LINK />
Можно ли так сделать, чтобы по LINK-у получить именно тот Node "Type". Если в XML такие ссылки?
Щя разберусь с этими Пасами, недавно тока пришел с лабы

freezer

а как еще проверить что XML валиден?..
Вот, допустим его действительно прислала форма с DataBinding (Data Island) или это хакер злобно хакает сервак невалидным XML'ем?!

rid2000

гы... и как ты на него ссылаться собираешься?

Мой вопрос: Есть ли в XML ссылки на Node?

freezer

блин... как ты себе это представляешь?

rid2000

Если бы представлял, то не спрашивал бы...
А по поводу реализации этого, помойму можно такое сделать. И добавить это в DOM парсер.

6yrop

да, на XPathe можно, но удовлетворит ли это тебя?
первый вариант, испльзовать порядок расположения.
По любому тебе надо как-то отличать элементы <Type>, вот как ты будешь устраивать это различие, это и будешь прописывать в XPath-е

6yrop

Кстати, в XSLT можно XPath брать из атрибута?
нет, нельзя (хотя ошибаться может каждый )
Вообще, полгода назад я уже писал, не следует использовать XSLT по его не прямому назначению, дальше простых вещей вам не удастся продвинуться. Его прямое назначение - преобразования для отображения XML-документов (см. анатоцию к спецификации).

bastii

я думаю ответ нужно искать в xsd (dtd устарели связанной с этим xml документом
т.е. можно в xsd прописать как-нибуть так:
<element name="type"> .... </element>
<element name="object">
<complexType>
.....
<attribute name="ofType" type="NCTOKEN" mustRefToElement="type"/>
</complexType>
</element>
тогда в DOМ может и будет возможность для атрибута ofType получить не строку, а узел соотв типа

bastii

сто пудов
это прописано в в документации по DOM в Java:
In XML, where the value of an attribute can contain entity references, the child nodes of the Attr node may be either Text or EntityReference nodes (when these are in use; see the description of EntityReference for discussion).
Осталось только выяснить, как это оформить в схеме

Dasar

Рекомендуется использовать xsd (xml-scheme а не DTD

6yrop

имхо: бред
посмотри спецификацю XML Schema, прежде чем "прописать как-нибуть так", а не придумывай свои атрибуты. Атрибута mustRefToElement нет.

bastii

так это была идея как это может быть.
я сам не знаю как это делается на самом деле.
в этом и вопрос состоит

Dasar

> Такое бывает?
Можешь попробовать поюзать XPointer: http://www.w3.org/TR/WD-xptr

bastii

нашел: смотрите раздел 5.1 в http://www.w3.org/TR/xmlschema-0/

bastii

вернее раздел 5.2

6yrop

ты не просек фишки

bastii

ну че, так сработает?
схема имеет след. вид:
...
<element name="type">
<complexType>
...
<attribute name="name" type="token"/>
</complexType>
</element>
<element name="object">
<complexType>
...
<attribute name="objOfType" type="token"/>
</complexType>
</element>
<key name="typeNameKey">
<selector xpath="type"/>
<field xpath="@name"/>
</key>
<keyref name="objOfTypeKeyref">
<selector xpath="object"/>
<field xpath="@objOfType"/>
</keyref>
....
вот только не уверен в xpath в selectore.
интересно, DOM Parser рюхнет, и если да, то будет идексировать по ключам (думаю, что XPathDocument в .Net индексирует)
Ельдар, проверить не хочешь?

6yrop

XML-документы хюмен ридбл, поэтому как ты себе представляешь экземпляр документа, которго ты хочешь? от этого и отталкивайся. Схема накладывает лишь ограничения целостности.
Мой прогноз: работа не будет

6yrop

причем тут индексирование я ваще не понял

bastii

документ такой же, только в нем не должны повторяться имена типов.
а индексирование тем, чтобы это оганичение эффективно тестить при построении DOM дерева и возможно потом при реализации метода getChild у соотв Attr.

6yrop

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

bastii

работает, я провел, в .Net мне xsd.exe по этой схеме делает классы module. TypeType, ObjecType и работает потом Xml сериализация
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="moduleSchema" targetNamespace="http://tempuri.org/moduleSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/moduleSchema.xsd" xmlns:mstns="http://tempuri.org/moduleSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="module">
<xs:complexType>
<xs:sequence>
<xs:element name="types">
<xs:complexType>
<xs:sequence>
<xs:element name="type" type="TypeType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="objects">
<xs:complexType>
<xs:sequence>
<xs:element name="object" type="ObjectType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="typeNameKey" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:type" />
<xs:field xpath="@name" />
</xs:key>
<xs:key name="objectNameKey" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:object" />
<xs:field xpath="@name" />
</xs:key>
<xs:keyref name="objectOfTypeKeyref" refer="typeNameKey">
<xs:selector xpath=".//mstns:object" />
<xs:field xpath="@objectOfType" />
</xs:keyref>
</xs:element>
<xs:complexType name="TypeType">
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
<xs:complexType name="ObjectType">
<xs:attribute name="name" type="xs:string" />
<xs:attribute name="objectOfType" type="xs:string" />
</xs:complexType>
</xs:schema>

bastii

маза в том, что эту схема в дезайнере схем сваял в VS

Dasar

Классы-то делает, но вот ссылок как раз и не видно.

bastii

DOM я не смотрел, а XmlSerializer не поддерживает циклические ссылки
Но в схеме связи выражаются через key и keyref как в присере, что я написал

6yrop

Пиздец, в начале треда вам теребовались ссылки , теперь вы говорите о том как в .Net-те идет XML-сериализация. Я хуею с вас товарищи, чё вам надо, зачем было этот тред заводить?

bastii

увлекся
а похоже делает через селект как раньше предложили
Оставить комментарий
Имя или ник:
Комментарий: