Проверка xml на xsd для обнаружения только определенных ошибок - PullRequest
3 голосов
/ 15 июля 2010

У меня есть файл импорта, который нужно пропустить и продолжить при определенных ошибках.Я хочу игнорировать ошибки для типа данных, минимальной / максимальной длины и обязательных полей.Я хочу ловить и отображать ошибки об элементах, которые неправильно отформатированы и находятся в неправильном месте.

В этом случае файл содержит коллекцию людей.

Я хочу уловить ошибки: 1: дочерний узел за пределами личного узла.2: Ребенок за пределами узла человека.3: Человек вне узла людей.

Я хочу игнорировать ошибки: 1: У ребенка нет имени.2: у человека нет даты рождения.

<xs:element name="People">
<xs:complexType>
  <xs:sequence>
    <xs:element name="Person" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:all>
          <xs:element name="FirstName" minOccurs="1" maxOccurs="1">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:minLength value="1"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
          <xs:element name="LastName" minOccurs="1" maxOccurs="1">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:minLength value="1"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
          <xs:element name="BirthDate" type="Date" minOccurs="1" maxOccurs="1"/>              
          <xs:element name="Children">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Child" minOccurs="1" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:all>
                      <xs:element name="FirstName" minOccurs="0" maxOccurs="1">
                        <xs:simpleType>
                          <xs:restriction base="xs:string">
                            <xs:minLength value="1"/>
                          </xs:restriction>
                        </xs:simpleType>
                      </xs:element>
                      <xs:element name="BirthDate" type="Date" minOccurs="1" maxOccurs="1"/>              
                      </xs:all>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:all>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

Ответы [ 2 ]

0 голосов
/ 21 августа 2012

Остановка или продолжение при представлении неверного ввода, в принципе, полностью зависит от выбора программного обеспечения, поэтому то, что вы описываете, логически логично, хотя, возможно, немного необычно.Если вы можете получить необходимую информацию через используемый вами API, нет причин не заставлять программное обеспечение вести себя так, как вы описываете, и это, вероятно, предпочтительный вариант.(Но я не могу помочь вам с этим.)

Если вы не можете получить необходимую информацию через API (некоторые API предполагают, что проверка - это просто да / нет), одна из возможныхальтернативной альтернативой может быть проверка с использованием отдельной ослабленной схемы, как описано в ответе ssamuel, так что единственными ошибками проверки являются те, которые вы хотите считать фатальными.

То есть: есть два способа решения этой проблемы: (1) откажитесь от идеи, что вы должны всегда прерывать неверный ввод: получите валидатор, чтобы дать вам больше информации, чтобы вы могли решить остановиться или продолжить.Или (2) отойти от идеи, что существует единственная схема, которая применяется ко всей обработке документа: используйте одну схему для создания документа и другую схему для решения, что делать с вводом.

0 голосов
/ 25 июля 2010

Измените вашу схему следующим образом:

  • В объявлении элемента Firstname в разделе Child добавьте атрибут type = "xs: string".Также удалите все содержимое объявления элемента (simpleType и т. Д.).Вы можете сделать тег самозакрывающимся, если хотите.
  • В объявлении элемента Birthdate измените minOccurs с 1 на 0.

Первое изменение снимает ограничение, которое в настоящее время установленоимя ребенка, которое должно содержать как минимум один символ.Добавление атрибута type необходимо, поскольку вы удаляете текущее определение типа элемента.

Второе изменение сообщает валидатору, что дата рождения не требуется.

Внесите эти изменения и XMLчто вы хотите проверить, следует.

...