xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Схема: any и при этом all


Автор Сообщение
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> Sad

Можно ли вообще сделать такое схемой?
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, что бы привести их в божеский вид.
А это идея!)

Спасибо!