2010-02-14 19 views
6

Mam plik xml, który ma pewne wartości daty i inne typy danych.Jak sprawdzić poprawność pustego tagu wartości ciągu w xsd

<Purchasedate Name="purcaseDate" value=""/> 

Sprawdzam poprawność tych plików xml za pomocą pliku xsd. W shcema w xsd Napisałem wzór wyrażenia regularnego dla formatu dd/mm/yyyy.

Działa to dobrze, jeśli atrybut value ma wartość. Mój wzorzec waliduje na podstawie atrybutu wartości.

Pole (purchasedate) nie jest obowiązkowe. jeśli value = "", oznacza to, że mój wzorzec sprawdza także na pustym łańcuchu, który nie jest obowiązkowy.

Potrzebuję do sprawdzenia opcjonalnego pola i używam również <xs:attribute name="PurchaseDate" use="optional"> również.

Muszę zweryfikować to pole, gdy znacznik wartości nie jest pusty.

Odpowiedz

9

To zbyt proste ..

Wystarczy wszystko co musisz zrobić, to włączyć specyfikacji pusty ciąg w swoim pattern

Jest to sposób, aby to zrobić .. <xs:pattern value="|(Regular_pattern_goes_here)"/>

celach informacyjnych Pisałem próbki fragmentów kodów .. po prostu przejść przez nich ..

próbki XML:

<?xml version="1.0" encoding="utf-8"?> 
<xmln xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com XMLFile1.xsd" xmlns="http://www.xsdef.com/xml/123"> 
    <Purchasedate Name="purcaseDate" value=""/> 
</xmln> 

próbki XSD (to niestandardowego typu def)

<xs:schema xmlns:xsLocal="http://www.xsdef.com/xml/123" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xsdef.com/xml/123" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="xmln"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Purchasedate"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute name="Name" type="xs:string" use="required" /> 
       <xs:attribute name="value" type="xsLocal:CUSTOM_DATE" use="required" /> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="CUSTOM_DATE"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="|((01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)/(01|02|03|04|05|06|07|08|09|10|11|12)/[1-2][0-9][0-9][0-9])"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 
0

Znak? znak w Regeksie oznacza, że ​​znak przed nim musi wystąpić 0 lub 1 raz.

Tak więc w celu rozwiązania problemu należy owinąć regex w nawiasach i umieścić questionmark na koniec:

<xs:simpleType name="PurchaseDateType"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="(Regular_pattern_goes_here)?"/> 
    </xs:restriction> 
    </xs:simpleType> 

korzystać z tego typu na pola i powinno być w porządku

0

Jeśli kontrolujesz składnię XML, powinieneś rozważyć zdefiniowanie elementu w następujący sposób. Ponieważ XML-Schema już zawiera typ daty, powinieneś go używać, chyba że masz naprawdę dobry powód. Mówię to, ponieważ ułatwi innym korzystanie z xml, a ty będziesz mógł później korzystać z lepszych frameworków kodu. Nie uwzględniłem atrybutu "name", ponieważ wydawało się zbędne dla nazwy elementu.

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

<xs:element name="Purchasedate" nillable="true" type="xs:date"/> 
<xs:element name="Purchasedate2"> 
    <xs:complexType> 
     <xs:attribute name="value" type="xs:date"/> 
    </xs:complexType> 
</xs:element> 
<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="Purchasedate"/> 
      <xs:element minOccurs="0" ref="Purchasedate2"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Powiązane problemy