Определить элемент как непустой в RelaxNG - PullRequest
3 голосов
/ 01 июня 2011

Я начал использовать RelaxNG для определения схем сообщений XML и использовать PHP DOMDocument для проверки и анализа входящих сообщений, но не могу понять, как определить текстовый узел, чтобы он не мог быть пустым. Пример схемы:

<?xml version="1.0"?>
<element name="amhAPI" xmlns="http://relaxng.org/ns/structure/1.0">
    <element name="auth">
        <element name="validateUser">
            <element name="username">
                <text/>
            </element>

            <element name="password">
                <text/>
            </element>
        </element>
    </element>
</element>

Однако приведенное ниже сообщение проверяется как правильное с помощью метода DOMDocument :: relaxNGValidate (поскольку relaxng соответствует любой произвольной строке [включая пустую] с text шаблон) и эквивалентно):

<?xml version="1.0"?>
<amhAPI>
    <auth>
        <validateUser>
            <username/>
            <password/>
        </validateUser>
    </auth>
</amhAPI>

Из-за этого я должен добавить в набор проверок и проверок для полей, которые не должны быть пустыми, которые можно было бы удалить, если бы валидатор определил их как непустые элементы.

Есть ли способ форсировать непустой текст?

Ответы [ 3 ]

10 голосов
/ 14 ноября 2012

Предыдущие решения не всегда работают очень хорошо.Если вы установите для фасета minLength значение «1», будет принят один единственный символ пробела (или один символ новой строки).Если вы используете шаблон .*[\S]+.*, вы не можете вставить какой-либо символ новой строки, но это полезно только для "username" и "password" (см. Пример выше).

Регулярные выражения - правильныеКстати, но для определения элемента как непустого, лучшим решением (для меня) является общий шаблон: (.|\n|\r)*\S(.|\n|\r)*, так что вы также можете использовать символы новой строки где угодно.

4 голосов
/ 01 июня 2011

Если ваш валидатор RELAX NG поддерживает типы данных XSD (большинство это делают), то вы можете использовать регулярные выражения для уточнения ограничений для текстового содержимого:

<?xml version="1.0"?>
<element name="amhAPI" xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <element name="auth">
    <element name="validateUser">
      <element name="username">
        <data type="string">
          <param name="pattern">.+</param>
        </data>
      </element>
      <element name="password">
        <data type="string">
          <param name="pattern">.+</param>
        </data>
      </element>
    </element>
  </element>
</element>
0 голосов
/ 09 февраля 2012

Кроме того, использование minLength кажется более прямым и понятным, чем регулярные выражения. (Это также требует типов данных XSD.)

<element name="amhAPI" xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <element name="auth">
    <element name="validateUser">
      <element name="username">
        <data type="string">
          <param name="minLength">1</param>
        </data>
      </element>
      <element name="password">
        <data type="string">
          <param name="minLength">1</param>
        </data>
      </element>
    </element>
  </element>
</element>
...