2016-03-01 59 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

以下是@ Tomalak(精,+1)正則表達式解決方案的替代方案。這種方法使用xs:minLengthxs:whiteSpace方面,而不是一個正則表達式xs:pattern

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