Автор |
Сообщение |
IInk
Гость
|
[12378]
Пт Апр 11, 2008 21:29
Схема: any и при этом all
Hi all:)
Мой вопрос наверное глуп, но я крайне слаб в XML схемах:((
Хочется что бы неком элементе могли быть несколько заранее определенных элементов (в любом порядке) и любые другие элементы.
На определенные накладывается ограничение.
Например:
Код:
<!-- login и password - обязательные теги, остальные - опционально.-->
<user>
<login>asd</login>
<чтоугодно1>asdasd</чтоугодно1>
<password>asd</password>
<чтоугодно>asdasd</чтоугодно>
</user>
<чтоугодно> это <xs:any>, но ведь он работает только в <xs:sequence>, а там важен порядок. Мне же порядок не важен (логин и пароль могут идти как хотят), тогда мне нужен <xs:all>, но там не работает <xs:any>
Можно ли вообще сделать такое схемой?
|
Vasilisk
Наставник
Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[12381]
Вс Апр 13, 2008 17:28
А вариант, когда идет в начале (или в конце) логин и пароль (в любом порядке), а потом что-угодно в любом поряке не подходит?
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
IInk
Гость
|
[12382]
Пн Апр 14, 2008 00:52
Можно, но лучше бы что бы между ними тоже могло быть все, что угодно.
А то, что Вы предлагаете реализуется через ComplexContent, тоесть там сначала будет
Код:
<xs:all>
<xs:element name="login..
</xs:all>
а потом
Код:
<xs:sequence>
<xs:any
я верно понял?
|
Vasilisk
Наставник
Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[12384]
Пн Апр 14, 2008 15:04
я предлагаю <xsd:group>
Кстати, попробуйте так
Код:
<xsd:group name="other_fields">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded">
</xsd:sequence>
</xsd:group>
<xsd:element name="user">
<xsd:complexType>
<xsd:all>
<xsd:group ref="other_fields"/>
<xsd:element name="login" type="xsd:string"/>
<xsd:group ref="other_fields"/>
<xsd:element name="password" type="xsd:string"/>
<xsd:group ref="other_fields"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
IInk
Гость
|
[12388]
Пн Апр 14, 2008 19:32
К сожалению вынос в группу не помог.
Внутри *all* не может быть *any*
Код:
<xsd:all>
<xsd:group ref="other_fields"/>
<!-- Вот тут получаю ошибку unexpected child-->
Я тут поразмыслил - наверное я неправильного хочу.
То, что я хочу никак не описывается функционально, увы.
Так что сделать это схемой, видимо, не выйдет.
Ладно, я решу проблему несколько по другому, без помощи схемы, а схему сделаю более общей.
Спасибо за отзывы
|
Vasilisk
Наставник
Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[12389]
Пн Апр 14, 2008 19:52
IInk писал(а): Я тут поразмыслил - наверное я неправильного хочу.
Это да. честно говоря непонятно откуда такие требования? Они противоречат здравому смылу. Нужно отделять мух от котлет. А не смешивать в один узел все подряд.
Самое красивое решение - это вынести логин и пароль в атрибуты, а внутри узла поставить <xsd:any>
Ну и остальные решения производные от этого
1) бросить логин и пароль в отдельный дочерний узел
2) бросить <xsd:any> в отдельный дочерний узел
3) 1 + 2
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
IInk
Гость
|
[12390]
Пн Апр 14, 2008 21:32
Понимаете, у меня несколько странная ситуация.
Есть некий XML-RPC.
Мне надо сделать его эмулятор для тестирования его клиента.
Сам XML-RPC писан не мной, писан ужасно, и работает именно по таким правилам. Это я выяснил методом тыка.
Я не знаю, как они парсят XML. Порой мне кажется они делают это регулярными выражениями, или даже простым поиском по строке)
Что бы валидировать запросы к моему эмулятору, я хотел составить схему, соответствующую их прекрастной логике.
Будь я разработчиком сервиса, я бы никогда не придумал бы столь странную схему:)
|
Vasilisk
Наставник
Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
|
[12391]
Пн Апр 14, 2008 23:14
Ужас. Стрелять таких писателей
А если пойти по такому пути (я один раз так делал, когда нужно было лазить DOM'ом по всему XML и вытягивать данные)
1) Пишем XSL в котором тянем только нужные нам данные и складываем в XML удобной для нас структуры
2) Валидируем полученный XML схемой
3) Обрабатываем его (для скорости можно даже парсить SAX'ом)
_________________ С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
|
IInk
Гость
|
[12392]
Вт Апр 15, 2008 01:23
Тоесть сначала обработать данные XSLT, что бы привести их в божеский вид.
А это идея!)
Спасибо!
|