XML Validierung
berlinsurfer
- xml
0 ChrisB0 berlinsurfer0 MudGuard
1 MudGuard0 berlinsurfer0 MudGuard
Hallo,
mal wieder das leidige Thema XML-Validierung:
ich bekomme ein Schema gelifert, in dem steht:
<xs:simpleType name="typ-Anschrift">
<xs:restriction base="xs:string">
<xs:maxLength value="100"/>
<xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-[\t\r\n]]*"/>
</xs:restriction>
</xs:simpleType>
Das liest sich für mich wie das das erste Zeichen aus Basic-Latin oder Latin-1-Supplement sein darf, jedoch kein Leerzeichen, Tab, Carriage Return oder Newline.
Für das zweite und jedes folgende gilt das Gleiche, nur sind hier Leerzeichen wieder erlaubt.
Nun versuche ich in php mittels $dom->schemaValidate() die xml-Datei zu validieren, schaffe es jedoch nur, wenn der zu matchende String keine ts,rs oder ns enthält. Es werden nicht die Sonderzeichen, sondern die Buchstaben erkannt. Wo ist da der Fehler ? Ist obiger Ausdruck nicht gleichbedeutend mit (indem die zweite Klasse auseinandergepflückt wurde; dieser funktioniert):
<xs:simpleType name="typ-Anschrift">
<xs:restriction base="xs:string">
<xs:maxLength value="100"/>
<xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-\t-\r-\n]*"/>
</xs:restriction>
</xs:simpleType>
Siehe auch:
https://forum.selfhtml.org/?t=202319&m=1366332
Danke & Gruß,
berlinsurfer
Hi,
<xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-[\t\r\n]]*"/>
http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#charcter-classes
Ich kann dort nicht erkennen, dass eine Character Class Expression innerhalb einer Character Class Expression erlaubt (bzw. sinnvoll) wäre.
MfG ChrisB
Danke, ChrisB,
warum funktioniert es denn aber korrekt im RegEx Buddy ?
Liegt PHP eine andere Engine zugrunde ?
Ich kann dort nicht erkennen, dass eine Character Class Expression innerhalb einer Character Class Expression erlaubt (bzw. sinnvoll) wäre.
MfG ChrisB
Hi,
warum funktioniert es denn aber korrekt im RegEx Buddy ?
Nur weil ChrisB das nicht erkennen kann, muß es ja nicht so sein, siehe mein Posting von 17:57
cu,
Andreas
Hi,
<xs:pattern value="[\p{IsBasicLatin}\p{IsLatin-1Supplement}-[ \t\r\n]][\p{IsBasicLatin}\p{IsLatin-1Supplement}-[\t\r\n]]*"/>
http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#charcter-classes
Ich kann dort nicht erkennen, dass eine Character Class Expression innerhalb einer Character Class Expression erlaubt (bzw. sinnvoll) wäre.
Nächstes Mal genauer hinschauen ;-)
11 charClass ::= charClassEsc | charClassExpr | WildcardEsc
Da nehmen wir die charClassExpr
12 charClassExpr ::= '[' charGroup ']'
weiter mit der charGroup
13 charGroup ::= posCharGroup | negCharGroup | charClassSub
da nehmen wir die charClassSub
16 charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr
hier nehmen wir posCharGroup - charClassExpr
Für posCharGroup
14 posCharGroup ::= ( charRange | charClassEsc )+
diesen Teil könnte man jetzt Regel für Regel weiter zerlegen (über charClassEsc -> catEsc ...), aber kurz gesagt deckt der das
\p{IsBasicLatin}\p{IsLatin-1Supplement}
ab.
bleibt also noch das - und charClassExpr. - als Literal braucht nicht weiter aufgelöst zu werden. Bleibt charClassExpr.
12 charClassExpr ::= '[' charGroup ']'
charGroup könnte ich wieder nach den Regeln weiter zerlegen (charRange -> XmlCharIncDash ..., charClassEsc->SingleCharEsc ...), aber kurz gesagt deckt das die 4 Whitespace-Zeichen ab.
Diese charClassExpr deckt also [ \t\r\n] ab.
Gehen wir wieder zurück: davor war das literale -, also -[ \t\r\n]
Weiter zurück: posCharGroup-[ \t\r\n]
Noch weiter: [posCharGroup-[ \t\r\n]]
Und posCharGroup war ja das \p{IsBasicLatin}\p{IsLatin-1Supplement}, womit die erste [] aus dem Originalausdruck komplett abgedeckt ist.
cu,
Andreas
Hallo, Andreas,
vielen Dank für die ausführliche Beschreibung & Erklärung, sie war sehr hilfreich. Die betreffenden XSD-Dateien stammen vom Kratffahrtbundesamt, wahrscheinlich wissen die, was sie tun (hoffentlich...)
Zu meiner Ursprungsfrage: warum funktioniert die Validierung in PHP nicht, wenn ich -\t-\n-\r schreibe, aber schon ? Benutzt PHP eine andere RegEx-Engine ? Hat es überhaupt was damit zu tun ?
Vielen Dank schon mal & Gruß aus dem verschneiten Berlin
Hi,
vielen Dank für die ausführliche Beschreibung & Erklärung, sie war sehr hilfreich.
He, die war aber für Chris, nicht für Dich! ;-)
Die betreffenden XSD-Dateien stammen vom Kratffahrtbundesamt, wahrscheinlich wissen die, was sie tun (hoffentlich...)
Optimist ;-)
Zu meiner Ursprungsfrage: warum funktioniert die Validierung in PHP nicht,
Weil das Subtrahieren m.W. von den PCRE nicht unterstützt wird. Soweit ich weiß, kennt nur Java etwas ähnliches ([[a-z]&&[^aeiou]] für alle Konsonanten), aber mit deutlich anderer Syntax.
wenn ich -\t-\n-\r schreibe, aber schon ?
Wie sieht der Ausdruck genau aus?
Ich vermute aber, daß das "Funktionieren" Dir nur so vorkommt, und daß die Menge Deiner Teststrings die Fehler nicht aufzeigt.
Benutzt PHP eine andere RegEx-Engine ? Hat es überhaupt was damit zu tun ?
Ja. Meist PCRE oder veraltet ereg. Das erkennst Du am ersten Teil (ereg_ oder pcre_) der von Dir benutzten Funktion.
cu,
Andreas