Проверка XSD для отображения ошибки, когда нет значения ч / б элементов тега xml - PullRequest
0 голосов
/ 15 марта 2012

Считайте, что мой xml подобен этому. Он содержит корневой тег сотрудника и 2 дочерних тега, оба имеют строковый тип

<employee>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</employee>

и соответствующий xsd как этот

<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" minOccurs="1"/>
      <xs:element name="lastname" type="xs:string"minOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
</xs:element> 

Я хочу проверить, что имя и фамилия должны быть строковыми, и это должно произойти. Когда я дал type = "xs: string" и minOccurs = "1" и дал имя тега имени, как это (т.е.. нет значения ч / б тега), он не показывает ошибки ... Но я хочу показать ошибку, если нет значения ч / б тега. Что мне делать? Не могли бы вы дать мне решение как можно скорее?

1 Ответ

2 голосов
/ 15 марта 2012

Надеюсь, я вас хорошо понял, ваша проблема в том, что

<employee>
  <firstname></firstname>
  <lastname>Smith</lastname>
</employee>

действует в соответствии с XSD.

Прежде всего вы должны понимать, что во многих языках пустая строка и нулевое значение не одинаковы, например в Java:

String s1 = "";   // empty string, length is 0
String s2 = null; // null value, has no length...

Это не так для Oracle PL / SQL, где нулевая и пустая строки совпадают.

Так что я думаю, что этот действительный XML (в соответствии с вашим XSD) вам тоже не подходит:

<employee>
    <firstname xsi:nil="true" />
    <lastname xsi:nil="true" />
</employee>

Если у вас есть дополнительные условия, которым должны соответствовать имя / фамилия, вы должны создать собственный тип:

<xs:element name="employee">
    <xs:complexType>
        <xs:sequence>
            <!-- changed -->
            <xs:element name="firstname" type="e:firstnameType" />
            <!-- not changed -->
            <xs:element name="lastname" type="xs:string" minOccurs="1" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:simpleType name="firstnameType">
    <xs:restriction base="xs:string"> 
        <xs:whiteSpace value="collapse" />
        <xs:minLength value="1" />
    </xs:restriction> 
</xs:simpleType>

Хорошее описание коллапс здесь здесь . Другие ограничения для строки вы можете найти здесь .

Для других я добавляю свои полные файлы XSD и XML:

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:e="employee"
    targetNamespace="employee"
    elementFormDefault="qualified">
    <xs:element name="employee">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="firstname" type="e:firstnameType" />
          <xs:element name="lastname" type="xs:string" minOccurs="1"  />
        </xs:sequence>
      </xs:complexType>
    </xs:element>

    <xs:simpleType name="firstnameType">
        <xs:restriction base="xs:string"> 
            <xs:whiteSpace value="collapse" />
            <xs:minLength value="1" />
        </xs:restriction> 
    </xs:simpleType>
</xs:schema>

XML

<?xml version="1.0" encoding="UTF-8"?>
<employee xmlns="employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <firstname>Martin</firstname>
  <lastname xsi:nil="true"></lastname>
</employee>
...