|
XSD схема - как задать вхождение any элемента?
|
|||
---|---|---|---|
#18+
Доброго времени суток, уважаемые эксперты! Подскажите пожалуйста, как можно решить такую проблему: Есть XML файл, в котором задана последовательность элементов, но, есть элементы, которые могут появлятся в середине этого файла. Возможно ли описать их появление следующим образом? ... <xs:element name="etMain2.bar.Bar13.ItemLink0" type="ItemLink"/> <xs:element name="etMain2.bar.Bar13.ItemLink1" type="ItemLink"/> <xs:element name="etMain2.bar.Bar13.ItemLink2" type="ItemLink"/> <xs:any minOccurs="0" maxOccurs="unbounded"/> <xs:element name="etMain2.bar.SubItem_btnAdvancedCompare.ItemLink0" type="SubItem"/> <xs:element name="etMain2.bar.SubItem_btnAdvancedCompare.ItemLink1" type="SubItem"/> <xs:element name="etMain2.bar.SubItem_btnAdvancedCompare.ItemLink2" type="SubItem"/> ... Выдает ошибку Validating Schema.xsd... :0,0: Complex type '__AnonC1' violates the Unique Particle Attribution rule in its components '##any' and 'etMain2.bar.SubItem_btnAdvancedCompare.ItemLink0' The XML document ribbonSchemaOff.xsd is NOT valid (1 errors) Не понимаю в чем проблема, или способ вообще не верен? есть другой? Спасибо за Внимание! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2008, 19:52 |
|
XSD схема - как задать вхождение any элемента?
|
|||
---|---|---|---|
#18+
Акузя 03Не понимаю в чем проблема, или способ вообще не верен? есть другой? Проблема в том, что схема не детерминирована и парсер путается. Если после элемента etMain2.bar.Bar13.ItemLink2 будет идти элемент etMain2.bar.SubItem_btnAdvancedCompare.ItemLink0, то как парсеру знать этот элемент относится к xsd:any или к xsd:element? Решений много. 1) Поставить xsd:any в конец 2) Вынести его в отдельный уровень 3) Задать четкое количество вхождений 4) Объявить в другом пространстве имен ............. Вобщем цель - детерминировать схему ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2008, 22:57 |
|
XSD схема - как задать вхождение any элемента?
|
|||
---|---|---|---|
#18+
Уважаемый Vasilisk, благодарю за ответ! Начал пробовать реализовать способ №2 (вынести в отдельный уровень), но оказалось что не понял, что Вы имели ввиду, (тоесть сам XML я изменить не могу, и переразбить его на 2 уровня тоже, значит наверное способ отпадает?) Что касается поставить XSD в конец, не подходит по той же причине (не могу изменять XML) Попробывал обьявить в другом пространстве имен, а именно создал новый файл SchemaAddition: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.literaAddition.org" xmlns="http://www.literaAddition.org" elementFormDefault="unqualified"> <xs:complexType name="AdditionBar"> <xs:sequence> <xs:any minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema> а так же изменил шапку главной xsd схемы <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.litera.org" xmlns="http://www.litera.org" elementFormDefault="unqualified" xmlns:add="http://www.literaAddition.org"> <xs:import namespace="http://www.literaAddition.org" schemaLocation="ribbonSchemaAddition.xsd"/> а в ней (главной схеме) задал такое ... <xs:element name="etMain2.bar.Bar13.ItemLink0" type="ItemLink"/> <xs:element name="etMain2.bar.Bar13.ItemLink1" type="ItemLink"/> <xs:element name="etMain2.bar.Bar13.ItemLink2" type="ItemLink"/> <xs:any namespace="http://www.literaAddition.org" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="etMain2.bar.SubItem_btnAdvancedCompare.ItemLink0" type="SubItem"/> <xs:element name="etMain2.bar.SubItem_btnAdvancedCompare.ItemLink1" type="SubItem"/> <xs:element name="etMain2.bar.SubItem_btnAdvancedCompare.ItemLink2" type="SubItem"/> ... валидация схемы проходит, а вот самого XML c данными нет, наверное я снова не корректно понял что Вы имели ввиду, под обьявлением в другом пространстве имен. ошибка такая: Validating ribbon.xml... Schema.xsd has a different target namespace from the one specified in the instance document . наверное я не правильно описал шапку XML файла с данными <?xml version="1.0" encoding="UTF-8"?> <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="E:\- Work\litera core - excel pdf\cpx\ldc_exceld4\bin\ribbonSchema.xsd"> сейчас буду устранять ошибку, но кажется что возникнет другая =/ ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2008, 12:24 |
|
XSD схема - как задать вхождение any элемента?
|
|||
---|---|---|---|
#18+
Акузя 03тоесть сам XML я изменить не могу Тогда все отпадает. И придется Вам смириться с невалидируемым XML. Еще, как вариант, можно из схемы выкинуть все, что после <xsd:any>, тогда у Вас будет частичная валидация. Ну и еще подумать - у нужно ли вам это xsd:any или можно просто перечислить все элементы, которые могут там быть? Ну и в самых тяжелых случаях, можно написать XSL, которая приведет Ваш XML к некоторому удобоваримому виду, а потом на него уже накладывать XSD ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2008, 23:42 |
|
XSD схема - как задать вхождение any элемента?
|
|||
---|---|---|---|
#18+
Vasilisk, Большое Спасибо за разьяснения и помощь! Поправка - я до этого не совсем правильно выразился, элементы известны отчасти, но неизвестно их количество. Кому интересно, решение принял такое: <xs:element name="etMain2.bar.Bar14" type="Bar" minOccurs="0" maxOccurs="1"/> <xs:element name="etMain2.bar.Bar14.ItemLink0" type="ItemLink" minOccurs="0" maxOccurs="1"/> <xs:element name="etMain2.bar.Bar14.ItemLink1" type="ItemLink" minOccurs="0" maxOccurs="1"/> <xs:element name="etMain2.bar.Bar14.ItemLink2" type="ItemLink" minOccurs="0" maxOccurs="1"/> ... <xs:element name="etMain2.bar.Bar14.ItemLink11" type="ItemLink" minOccurs="0" maxOccurs="1"/> <xs:element name="etMain2.bar.Bar15" type="Bar" minOccurs="0" maxOccurs="1"/> <xs:element name="etMain2.bar.Bar15.ItemLink0" type="ItemLink" minOccurs="0" maxOccurs="1"/> <xs:element name="etMain2.bar.Bar15.ItemLink1" type="ItemLink" minOccurs="0" maxOccurs="1"/> ... <xs:element name="etMain2.bar.Bar15.ItemLink11" type="ItemLink" minOccurs="0" maxOccurs="1"/> ... <xs:element name="etMain2.bar.Bar19" type="Bar" minOccurs="0" maxOccurs="1"/> ... тоесть, если вдруг у элемента Bar будет больше 12 ItemLinks - валидация не будей пройдена, количество элементов Bar и ItemLinks предсказать наверняка нельзя, по-этому остается определенный риск выхода за предусмотренные рамки. (где Bar это панель инструментов, а Itemlinks кнопки на ней, панели и кол-во кнопок создаются пользователем) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2008, 12:18 |
|
|
start [/forum/topic.php?fid=14&fpage=50&tid=1333839]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 318ms |
total: | 457ms |
0 / 0 |