powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSD схема - как задать вхождение any элемента?
5 сообщений из 5, страница 1 из 1
XSD схема - как задать вхождение any элемента?
    #35432149
Фотография Акузя 03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток, уважаемые эксперты! Подскажите пожалуйста, как можно решить такую проблему:

Есть 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)

Не понимаю в чем проблема, или способ вообще не верен? есть другой? Спасибо за Внимание!
...
Рейтинг: 0 / 0
XSD схема - как задать вхождение any элемента?
    #35432345
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Акузя 03Не понимаю в чем проблема, или способ вообще не верен? есть другой?
Проблема в том, что схема не детерминирована и парсер путается. Если после элемента etMain2.bar.Bar13.ItemLink2 будет идти элемент etMain2.bar.SubItem_btnAdvancedCompare.ItemLink0, то как парсеру знать этот элемент относится к xsd:any или к xsd:element?

Решений много.
1) Поставить xsd:any в конец
2) Вынести его в отдельный уровень
3) Задать четкое количество вхождений
4) Объявить в другом пространстве имен
.............
Вобщем цель - детерминировать схему
...
Рейтинг: 0 / 0
XSD схема - как задать вхождение any элемента?
    #35433394
Фотография Акузя 03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый 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">

сейчас буду устранять ошибку, но кажется что возникнет другая =/
...
Рейтинг: 0 / 0
XSD схема - как задать вхождение any элемента?
    #35435309
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Акузя 03тоесть сам XML я изменить не могу
Тогда все отпадает. И придется Вам смириться с невалидируемым XML.

Еще, как вариант, можно из схемы выкинуть все, что после <xsd:any>, тогда у Вас будет частичная валидация.

Ну и еще подумать - у нужно ли вам это xsd:any или можно просто перечислить все элементы, которые могут там быть?

Ну и в самых тяжелых случаях, можно написать XSL, которая приведет Ваш XML к некоторому удобоваримому виду, а потом на него уже накладывать XSD
...
Рейтинг: 0 / 0
XSD схема - как задать вхождение any элемента?
    #35436248
Фотография Акузя 03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 кнопки на ней, панели и кол-во кнопок создаются пользователем)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSD схема - как задать вхождение any элемента?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]