XSD - несвязанное число любых (неизвестных) элементов, но последний элемент в последовательности определен - PullRequest
1 голос
/ 29 июля 2011

Возможно ли использовать один или несколько XSD для проверки следующей структуры XML

<container>
    <unkownA />
    <unkownB />
    <unkownC />
    ...
    <data />
</container>

по этим правилам

  1. существует неограниченное количество неизвестных элементов
  2. тамэто хотя бы один из этих неизвестных элементов
  3. последний элемент - данные
  4. данные появляются только один раз
  5. данные проверяются согласно предоставленным правилам

Все элементы в xml имеют то же пространство имен ("") , которое мы не можем изменить.Скорее всего, мы также не сможем изменить порядок элементов , хотя я знаю, что это, вероятно, самое простое решение.Изменение xml в целом не является жизнеспособным вариантом, поскольку он генерируется внешней системой, которую мы не контролируем.

Я пробовал что-то подобное

<xs:sequence>
   <xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax" />
   <xs:element ref="data" minOccurs="1" />
</xs:sequence>

, что, конечно,неоднозначно, нарушает «Уникальное присвоение частиц».

Я также читал об использовании второго пространства имен здесь Создание «гибкой» XML-схемы , но поскольку мы не можем изменить xml, этоне кажется решением, или я явно не понимаю его правильно.

Поскольку мы используем Java для обработки xml / xsd, xsd находится в classpath , поэтомуxs: импорт из xsd может быть проблемой.

Если ответ «Это невозможно сделать с xsd в этих ограничениях», я в порядке.

Так что любойидеи?

Ответы [ 3 ]

1 голос
/ 29 июля 2011

Схема, которую вы пробовали, действительна в XSD 1.1 - попробуйте снова, используя последний выпуск Saxon или Xerces.

0 голосов
/ 01 декабря 2011

Что, наконец, сработало, даже если это не делает меня счастливым:

javax.xml.validation.SchemaFactory schemaFactory = SchemaFactory
        .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

schemaFactory
    .setFeature(
        "http://apache.org/xml/features/validation/schema-full-checking",
        false);

Кажется, это отключает проверку самой схемы. Проверка правильности xml работает как ожидалось и описана выше. И да, я знаю: отключение функций безопасности / исправности, которые активированы по умолчанию, может быть плохой идеей. Но пока не узнаешь, что не было времени, чтобы найти лучший способ.

0 голосов
/ 29 июля 2011

Если вы, по крайней мере, знаете имена типов, которые, как вы ожидали, будут в вашем типе контейнера, вы можете сделать их типом xs: anyType. Но вам нужно знать список возможных имен типов, иначе какой смысл схемы определять их?

ОБНОВЛЕНИЕ: Я ошибся, вы можете сделать контейнер <xs:any/>, однако это не позволит вам указать, что в контейнере должен быть элемент <data />.

...