Схема XML, которая разрешает все (xsd:any)
Мне нужен пример схемы XML, которая позволит все и вся.
Это может звучать странно, но мне нужно это для отладки моей текущей схемы. Дело в том, что у меня есть сложный объект, который я использую в функции (часть DLL, которую я не контролирую) вместе со схемой, и эта функция возвращает мне XML. На данный момент функция выдает исключение, потому что при проверке со схемой произошла ошибка, но ее не должно быть. Итак, я хочу пустую схему, схему, которая не вызовет ошибки валидации, чтобы я мог видеть XML, выведенный функцией.
Я попытался взять мою текущую схему и оставить только тег xs:schema для создания пустой схемы, но это, очевидно, не сработало.
3 ответа
Схема XML не может указывать, что документ является действительным независимо от его содержимого.
Однако, если вы можете указать корневой элемент, вы можете использовать xs:anyAttribute
а также xs:any
чтобы разрешить любые атрибуты корневого элемента и любой XML в корневом каталоге:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
</xs:element>
</xs:schema>
В вашем случае, если вы можете быть уверены в конечном количестве возможных имен корневых элементов, вы можете использовать эту технику, чтобы разрешить любое содержимое XML под корневым элементом с известным именем.
Обновление: это может быть написано намного более кратко [Предоставлено: C. M. Sperberg-McQueen ]:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root"/>
</xs:schema>
Обратите внимание, что это разрешает, но не требует, root
быть пустым.
Часто предполагается, что схема XML разделяет документы на допустимые и недействительные. Это на самом деле довольно тонко, чем это. Когда вы вызываете проверку, вам нужно сказать, как вы хотите, чтобы проверка была выполнена. Наиболее распространенным вызовом является строгая проверка, в этом случае либо имя корневого элемента в вашем экземпляре документа должно соответствовать имени объявления глобального элемента в вашей схеме, либо он должен иметь атрибут xsi: type, соответствующий глобальному типу. определение в вашей схеме. Отсюда следует, что никакая конечная схема не будет соответствовать каждому экземпляру документа при строгой проверке.
В принципе, вы также можете вызвать процессор схемы для выполнения слабой проверки. В этом случае, если нет совпадения для имени корневого элемента среди объявлений глобального элемента в схеме, проверка завершается успешно. Таким образом, пустая схема (без объявлений) соответствует каждому документу экземпляра при слабой проверке.
Вы также можете вызвать проверку для именованного типа. Если вы вызываете проверку для именованного типа xs: anyType, то каждый экземпляр действителен, независимо от того, что говорит схема.
Предостережение: я значительно упростил правила здесь.
Вам не нужна или не нужна схема. XML-документы могут быть классифицированы как "правильно сформированные" и "действительные".
Как сказано выше, ответ гласит:
XML, который придерживается стандарта XML, считается правильно сформированным, в то время как XML, который придерживается DTD [или схемы], считается допустимым.
Я должен отметить, что все действительные документы XML также хорошо сформированы. Но в вашем случае вас не заботит "достоверность" XML-документа, просто его правильность. Все синтаксические анализаторы XML могут (на самом деле должны) проверять корректность, а проверка схемы обычно требует дополнительных шагов.
Посмотрите, как вы можете сделать первое (проверить правильность), не форсируя второе (проверка).