ugrás a tartalomhoz

XSD - mezőszám szűkítés

inf · 2011. Már. 18. (P), 03.49
Üdv.

Van egy összetett típusom, nevezzük most osztálynak:

	<xs:complexType name="User">
		<xs:all>
			<xs:element name="id" type="xs:positiveInteger" minOccurs="0" maxOccurs="1" />
			<xs:element name="email" type="email" minOccurs="0" maxOccurs="1" />
			<xs:element name="password" type="xs:string" minOccurs="0" maxOccurs="1" />
			<xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1" />
		</xs:all>
	</xs:complexType>
aminek vannak beágyazott elemei, őket nevezzük most mezőknek.

Ebből az osztályból szeretnék olyan szűkítéseket (leszármazott osztályokat) csinálni, amiknél az egyes mezők meglétét úgy ellenőrzöm, hogy nem adom meg újra a mezők típusait. A fenti példánál maradva, mondjuk a felhasználó névvel és email címmel regisztrál, aztán email-ben kap egy alap jelszót, amit megváltoztathat. Így a regisztrációnál csak a name és email mezőket kell megadni.

<Auth:register>
	<user>
		<name>Pistike</name>
		<email>a##kukac##b.d</email>
	</user>
</Auth:register>
Itt a user a User osztály egy olyan leszármazottjának példánya, ami megköveteli a name és email mezőket, illetve azt is megköveteli, hogy a többi mező ne szerepeljen.

A kérdésem az, hogy ezt hogyan lehet megoldani a php-ben használható xsd-vel?
 
1

Az 1.1-es xsd-ben van olyan,

inf · 2011. Már. 18. (P), 03.55
Az 1.1-es xsd-ben van olyan, hogy assert, ezzel xpath-el simán lehet ellenőrizni valamilyen mezőnek az előfordulását. Szóval egy extension+assert megoldja a problémát.

A gond ezzel az, hogy szerintem nem lehet 1.1-es xsd-t használni a php-vel, legalábbis nekem nem sikerült eddig. Nem találtam sehol leírást arról, hogy milyen verziót támogat a php, illetve, hogy az alapbeállítás ezzel kapcsolatban változtatható e. Szóval olyan 90%-ra teszem, hogy ezzel nem érek célba.

Kérdés az, hogy assert-en kívül vajh van e még más megoldás? (Én egyelőre az all szűkítése felé tapogatózom, de kevés sikerrel, nem találtam még infot arról, hogy lehetséges e ilyesmi.)
4

Utánanéztem jobban, libxml2

inf · 2011. Már. 19. (Szo), 16.17
Utánanéztem jobban, libxml2 is csak 1.0-s xsd-t támogat, szóval biztosan nincs php-ban xsd 1.1.
2

Pár szó még arról, hogy miért

inf · 2011. Már. 18. (P), 04.08
Pár szó még arról, hogy miért szükséges ez a "fordított logika".

Ugye a hagyományos az lenne, hogy van egy BasicUser osztály, aztán abból származtatom a LoginUser-t, meg a RegisterUser-t, és így tovább. Minden leszármazottba új mezők kerülnek be...

A gond ezzel az, hogy mondjuk ha csak a User-t vesszük, akkor van a regisztráció, ott name,email kell, aztán van a belépés, ott email,password kell, aztán van az adatmódosítás, ott tetszőleges mezők mehetnek úgy fel, hogy nem követeljük meg, csak az id-nek és plusz egy módosított mezőnek a meglétét (már ha ajax-ról van szó). Még ezer helyen lehet használni a User fajtákat úgy, hogy mindenhol totál eltérő, hogy milyen mezők kellenek.

Ezek a mezők nincsenek egymással szoros logikai kapcsolatban, szóval a User öröklődési fája úgy nézne ki, hogy van egy üres BasicUser, és van ezer leszármazottja egy szint mélységben, az alsóbb szinteken meg alig valami, a mezők típusainak a beállítása meg nagyon durván redundáns lenne. Az xsd redundanciája meg ugye kikövezett út a validálási hibákhoz... Ezért nem jó ez a fajta gondolkodás ebben az esetben.
3

Tovább okosodtam, elvileg, ha

inf · 2011. Már. 18. (P), 05.12
Tovább okosodtam, elvileg, ha minden egyes mezőt beteszünk egy-egy nevesített csoportba, és ezeket a csoportokat fűzzük össze, illetve nekik adunk occurence értékeket, akkor meg lehet oldani, hogy ne kelljen újra kiírni a mező típusát, és egyéb megkötéseit. Persze lehetne minden egyes mezőnek külön típusnevet adni, de az mégsem ugyanaz, a csoportokkal már egy fokkal jobban össze lehet fogni a dolgokat ahol van rá lehetőség... Csinálok erre is példát, aztán a végén blogbejegyzés lesz belőle, hogy hányféleképpen lehet megcsinálni :D
5

Mire való ez a bűvészkedés az

Hidvégi Gábor · 2011. Már. 20. (V), 10.09
Mire való ez a bűvészkedés az XSD-vel, hol veszed hasznát? Még nem volt vele dolgom eddig, bár nagyjából sejtem, mire jó.
6

Van egy olyan elgondolásom,

inf · 2011. Már. 26. (Szo), 02.10
Van egy olyan elgondolásom, hogy az adat XML-ben jön ki a szervertől, aztán XSL-el alakítom HTML-re, de a fordított irányt is XML-el szeretném megoldani, szóval az űrlapokat XML-ben küldeni, vagy ha nincs js, akkor a QueryString-et átalakítani ugyanolyan XML-re, és úgy validáltatni. Egyszerűbb így megoldani, mint if-ek halmazát írni minden egyes action-höz, sőt így lehet egyetlen fájlban is felületet leírni az alkalmazáshoz. Ugyanaz a módszer, mint a SOAP-pal csinálják, csak az én megoldásom annak egy lebutított változata.

Az XML egyébként azért is jó, mert le lehet írni benne HTML tageket is. Mondjuk ha megengeded a div-et, akkor be kell tenni az xsd fájlba a bejövő szöveghez, hogy div nevű element is lehet benne... Így a js injection-t is lehet szűrni a szövegből, illetve bizonyos formázással kapcsolatos dolgokat megengedni. Nem is feltétlen muszáj html tageket használni, mert XSL-el át lehet alakítani amúgy is majd a kirajzoláskor.

Az XSD-vel még lehetséges adatbázis táblák és kulcsok leírása. Aztán ha XSD-vel adja meg ezeket az ember, és ugyanolyan szerkezetű entitásokat vár a kliens oldaltól, akkor elég az XSD-t egyszer megírni, utána meg úgy szűkíteni a mezőket ahogy én próbálom. Szóval az a logika van mögötte, hogy előtte kidolgozom az adattároló osztályokat XSD-ben, aztán egyszer XSL-el SQL-t hozok létre, másrészt meg csinálhatok ugyanúgy osztályokat meg validáló kódot is ez alapján. Elég széles a skála, amire fel lehetne használni, egyelőre tesztelem, hogy mi az, amit lehet.

Azért vannak hátrányai is. Az űrlapnál ugye mezők vannak, aztán annak kiderítése, hogy melyik hibaüzenet melyik mezőre vonatkozik elég zűrös tud lenni bonyolultabb űrlapoknál. Szóval a hibaüzenetes részével lehetnek gondok, meg hát xsd 1.1-et még nem támogatja a php, pedig azzal sokkal komolyabb dolgokat lehet, mint az 1.0-val.