Может ли быть проверена структура элемента, заданного для xsd: any? - PullRequest
0 голосов
/ 19 декабря 2018

Я наткнулся на эту запись в w3schools о xsd: любая (пожалуйста, не комментируйте использование w3schools в качестве ссылки в целом, этот вопрос о том, прав ли w3schools в данном конкретном случае).Это в основном описывает, что у вас есть этот элемент в качестве базы (в некоторой схеме family.xsd):

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:any minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

И затем вы определяете дополнительную схему children.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="https://www.w3schools.com"
           xmlns="https://www.w3schools.com"
           elementFormDefault="qualified">
  <xs:element name="children">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="childname" type="xs:string"
                    maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema> 

Теперьони говорят, что на основе этих схем вы можете написать этот документ, который будет действительным:

<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns="http://www.microsoft.com"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.microsoft.com family.xsd
                             https://www.w3schools.com children.xsd">
  <person>
    <firstname>Hege</firstname>
    <lastname>Refsnes</lastname>
    <children>
      <childname>Cecilie</childname>
    </children>
  </person>
  <!-- ... -->
</persons>

Предполагая, что окружающая структура, определение которой не показано, является действительной, мой вопрос: может и будет лиВалидатор фактически проверяет правильность структуры элемента <children> здесь, и если да, то как?

Насколько я понимаю, вторая схема определяет документ, корнем которого является элемент <children>.Однако XSD не обеспечивает прямого сопоставления имени элемента с типом, поскольку элементы с одинаковыми именами в разных областях могут иметь разные типы (верно?).Так что, как я вижу, валидатор не может знать, что элемент <children>, указанный внутри <person>, должен действительно проверяться в соответствии с определением во второй схеме.Поэтому вторая схема здесь бесполезна, и документ будет действительным, даже если <children> содержит какой-то элемент <foo/>.Это правильно?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Атрибут processContents="strict" в xs:any говорит о том, что элемент, который появляется здесь, должен иметь глобальное объявление элемента и должен быть действительным для этого объявления.Для любого данного имени элемента может быть только одно глобальное объявление элемента (глобальное объявление - это то, которое появляется как потомок xs:schema).

В вашем случае документ недействителен из-за пространств имен.Целевое пространство имен для вашего документа схемы children.xsd - https://www.w3schools.com, но элемент children в экземпляре находится в пространстве имен http://www.microsoft.com.Таким образом, валидатор должен сообщить, что не найдено глобального объявления элемента для children.

0 голосов
/ 19 декабря 2018

Возможное решение

1) Обновите свой xsd с помощью:

<xs:any minOccurs="0" processContents="strict"/>

Это предотвратит принятие валидатором того, что "любой" xml.

2) Дизайнсупер-схема является объединением всех существующих схем и использует эту супер-схему в качестве входных данных для Validator.

Например (в Java):

Source xmlSource = // the xml to validate;
Source schemaSource = // your super xsd
Schema schema = schemaFactory.newSchema(schemaSource);
Validator validator = schema.newValidator();
validator.validate(xmlSource);
...