2016-03-01 2 views
1

В моей схеме XML я создал тип с именем NonEmptyString. Он должен отклонять любое значение, которое является нулевым или состоит из ничего, кроме пробела. Я обернулся, чтобы сказать, что он должен принимать все, что имеет хотя бы один символ без пробелов. Это должно включать что-либо с пробелом между двумя символами без пробелов. Тем не менее, он отклоняет «BATCH ANNEAL», принимая «BATCH_ANNEAL».Зачем нужна проверка пробела?

В случае, если это имеет значение, я собираюсь использовать эту схему в сценарии Python 3, хотя this XML validator отвергает ее.

Вот определение XML Schema:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="\S+" /> 
    </xs:restriction> 
    </xs:simpleType> 

<xs:element name="MESSAGE"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element type="xs:short" name="MESSAGE_NUMBER"/> 
     <xs:element type="NonEmptyString" name="MESSAGE_TYPE"/> 
     <xs:element type="NonEmptyString" name="PLANT_CODE"/> 
     <xs:element type="NonEmptyString" name="PLANT_TEXT"/> 
     <xs:element type="xs:dateTime" name="TIMESTAMP"/> 
     <xs:element type="NonEmptyString" name="SIMULATION_INDEX"/> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Вот элемент Я пытаюсь проверить против него.

<MESSAGE> 
    <MESSAGE_NUMBER>2601</MESSAGE_NUMBER> 
    <MESSAGE_TYPE>MaterialData</MESSAGE_TYPE> 
    <PLANT_CODE>ANBA</PLANT_CODE> 
    <PLANT_TEXT>BATCH ANNEAL</PLANT_TEXT> 
    <TIMESTAMP>2016-03-01T08:54:53</TIMESTAMP> 
    <SIMULATION_INDEX>N</SIMULATION_INDEX> 
</MESSAGE> 

ответ

2

Узор всегда должно полностью совпадать значение . \S+ матча "BATCH_ANNEAL" но это не соответствует "BATCH ANNEAL".

Попробуйте

<xs:pattern value="\S+|\S.*\S" /> 

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

+0

спасибо. Я не думаю, что это достаточно полное решение для меня. Что делать, если есть три или более слова? Я попробовал \ S + (\ s + \ S *) *, который, согласно pythex.org, соответствует всей строке «BATCH ANNEAL», но валидатор все же отвергает ее. Я пытаюсь обернуть голову вокруг слова «матч» в регулярных выражениях. Из того, что я прочитал, строка «соответствует» регулярному выражению, если подстрока строки, начинающаяся в начале строки, соответствует критериям, указанным в шаблоне, но это не обязательно означает, что вся строка соответствует этим критериям. –

+0

* Обычно * это так (то есть обычно шаблон может ссылаться на подстроку), но для целей проверки частичные совпадения не являются полезными. Вот почему '' будет проверять строку на '^ foo $'. Три или более слова соответствуют части '\ S. * \ S' комплекса' \ S + \ \ S. * \ S', я не думаю, что это будет проблематично. – Tomalak

+1

Я просто попробовал вашу строку, и она действительно работает. Большое спасибо! Я нашел объяснение аромата регулярного выражения, используемого при проверке XSD здесь: http://www.regular-expressions.info/xml.html. Часть соединения, которая сопоставляется тремя словами, означает «Непространство, за которым следует любое количество символов, за которым следует не космос», правильно? –

1

А вот альтернатива решению Tomamak (отлично, +1) с регулярным выражением. Этот подход использует xs:minLength и xs:whiteSpace граней вместо xs:pattern регулярного выражения:

<xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
    <xs:minLength value="1" /> 
    <xs:whiteSpace value='collapse'/> 
    </xs:restriction> 
</xs:simpleType> 
Смежные вопросы