24 tip: Validácia dokumentov XML oproti schéme XML / Tipy a triky s Caché

Pri svo­jej prá­ci s do­ku­men­tmi XML sa mô­že­te stret­núť s po­žia­dav­kou va­li­dá­cie XML op­ro­ti sché­me. Ak sa po­zrie­te do do­ku­men­tá­cie roz­hra­nia API pre trie­du % XML.TextRea­der, pri pr­vom poh­ľa­de ľah­ko na­do­bud­ne­te do­jem, že je to jed­no­du­chá vec a ni­ja­ký zá­drh v tom nie je. Sta­čí pou­žiť niek­to­rú z me­tód ur­če­ných na pre­chá­dzanie do­ku­men­tom XML, napr. me­tó­du Par­se­Fi­le (), správ­ne nas­ta­viť vstup­né pa­ra­met­re (in­tuícia nám ho­vo­rí, že to bu­dú prav­de­po­dob­ne pa­ra­met­re Fi­le­na­me a Sche­maS­pec) a všet­ko pre­beh­ne na na­šu úpl­nú spo­koj­nosť. Kým si to neo­tes­tu­je­te, ne­má­te ani tu­še­nie o tom, že je tu uk­ry­tý ma­lý zá­drh. Pred­pok­la­daj­me pre jed­no­du­chosť, že chce­me va­li­do­vať jed­no­du­chý do­ku­ment XML, aký je uve­de­ný ďa­lej:

|<?xml ver­sion="1.0" ?>↓
<p:Per­son xmlns:p="http://temp.org" ↓
 xmlns:xsi=" http://www.w3.org/2001/XML­Sche­ma-in­stan­ce " ↓
 xsi:sche­ma­Lo­ca­tion=" http://temp.org fi­le:///c:\Ho­me\Ca­che\Tmp\Per­son.xsd" >↓
 <P:Na­me>Black, Joe D. </p:Na­me>↓
</p:Per­son>←

op­ro­ti sché­me XML:

|<?xml vi­sion="1.0" en­co­ding="UTF-8"?>↓
<s:sche­ma xmlns:s="http://www.w3.org/2001/XML­Sche­ma"↓
 xmlns:p="http://temp.org"↓
 tar­get­Na­mes­pa­ce="http://temp.org" ele­men­tFor­mDe­fault="quali­fied">↓
 <s:ele­ment na­me="Per­son"> ↓
 <s:com­plexTy­pe>↓
 <s:sequen­ce>↓
 <s:ele­ment mi­nOc­curs="1" na­me="Na­me" ty­pe="s:string"/>↓
 </s:sequen­ce>↓
 </s:com­plexTy­pe>↓
 </s:ele­ment>↓
</s:sche­ma>←

Jed­no­du­chá me­tó­da, kto­rá by moh­la otes­to­vať, či je uve­de­ný do­ku­ment XML op­ro­ti sché­me va­lid­ný, by moh­la vy­ze­rať tak­to:

43
44 Clas­sMet­hod va­li­da­te­Do­cu­ment(
45 pFi­le As %String = " "
46□ pSche­ma As %String = " ") as %Sta­tus
47 {
48 //de­fi­nuj mak­ra
49 #De­fi­ne FI­LE "c:\Ho­me\Ca­che\Tmp\Per­son.xml"
50 #De­fi­ne SCHE­MA " "
51
52 set:´pFi­le pFi­le = $$$FI­LE
53 set:´pSche­ma tSche­maS­pec = $$$SCHE­MA
54
55 set tRe­sol­ver = $$$NULLO­REF
56 set tFlags = $$$SAXDE­FAULTS
57 set tMask = $$$SAXCON­TEN­TE­VENTS
58 set tSche­maS­pec = $$$SCHE­MA
59
60 // par­suj do­ku­ment
61 set tSC=##class(%XML.TextRea­der).Par­se­Fi­le(pFi­le,.tRea­der,tRe­sol­ver,tFlags,tMask, tSche­maS­pec)
62
63 // otes­tuj chy­bo­vy stav
64 if $$$ISERR(tSC) do $Sys­tem.Sta­tus.Dis­playError(tSC) quit
65
66 // pre­cha­dzaj do­ku­ment uzol po uz­le
67 whi­le tRea­der.Read() {
68 if (tRea­der.No­de­Ty­pe="error") ! (tRead.No­de­Ty­pe="war­ning"){
69 Wri­te !, "No­de ", tRea­der.seq, "is a(n) "
70 Wri­te tRead.No­de­Ty­pe, " "
71
72 If tRea­der.Na­me´=" " {
73 Wri­te "na­med: ", tRea­der.Na­me
74 }
75 El­se {
76 Wri­te „and has no na­me"
77 }
78
79 Wri­te !, " path: ", tRea­der.Path
80
81 If tRea­der.Va­lue´=" " {
82 Wri­te !, " va­lue: ",tRea­der.Va­lue
83 }
84 }
85 }
86 quit tSC
87 }

Spus­tí­te ju z ter­mi­ná­lu a všet­ko vy­ze­rá v po­riad­ku, ale po chvíľ­ke vo vás za­čne hlo­dať po­doz­re­nie, či nao­zaj va­li­dá­cia pre­beh­la, le­bo v do­ku­men­te XML sí­ce je uve­de­ná ces­ta k sché­me a pa­ra­me­ter tFlags je nas­ta­ve­ný tak, že sa má va­li­dá­cia vy­ko­ná­vať, ale ako je to s pa­ra­met­rom Sche­maS­pec? Po dl­hšom hľa­da­ní v do­ku­men­tá­cii sa doz­vie­te, že ak po­ža­du­je­te, aby sa vy­ko­ná­va­la va­li­dá­cia op­ro­ti sché­me, nes­ta­čí uviesť tie­to in­for­má­cie len v do­ku­men­te XML (za­da­ním ces­ty k sché­me), ale ich tre­ba za­dať aj v pa­ra­met­ri Sche­maS­pec. Ako však má tá­to in­for­má­cia vy­ze­rať, to už nik­de nie je uve­de­né. A tak za­čne­te expe­ri­men­to­vať. Pr­vé, čo vás na­pad­ne, je, že tu za­dá­te ces­tu k sú­bo­ru, v kto­rom je sché­ma XML de­fi­no­va­ná, t. j. skú­si­te up­ra­viť kód tak, že zme­ní­te ria­dok 50 na tvar: # De­fi­ne SCHÉMA "c: \ Ho­me \ Ca­che \ Tmp \ Per­son. xsd". Po spus­te­ní me­tó­dy v ter­mi­ná­li pri­chá­dza prek­va­pe­nie:

Ca­che TRM>3564 (CA­CHE20102RC)
XML­STU­DY> 33c­lass (XML.Utils.SAX) . va­li­da­te­Do­cu­ment ()
No­de 1 is a(n) error and has no na­me
 path:
 va­lue: sche­ma do­ku­ment ´c:\Ho­me\Ca­che\Tmp\Per­son.xsd´ has di­ffe­rent tar­get na­mes­pa­ce from the one spe­ci­fied in in­stan­ce do­ku­ment ´´ whi­le pro­ces­sing c:=\Ho­me\Ca­che\Tmp\Per­son.xml at li­ne 4 of­fset 781
XML­STU­DY>

Te­raz sí­ce k va­li­dá­cii op­ro­ti sché­me do­chá­dza, to je zrej­mé, ale Ca­ché tvr­dí, že váš do­ku­ment nie je plat­ný, pre­to­že sa ne­na­chá­dza v rov­na­kom men­nom pries­to­re, aký je uve­de­ný v sché­me. Len­že vy vie­te, že to nie je prav­da, pre­to­že keď otes­tu­je­te do­ku­ment XML iným va­li­dá­to­rom, ten potvr­dí, že všet­ko je v po­riad­ku. Kde je te­da chy­ba? Chy­ba spo­čí­va vo for­má­te, akým bol pa­ra­me­ter ScheS­pec za­da­ný. Správ­ny for­mát pa­ra­met­ra ScheS­pec je ta­ký, že sa v re­ťaz­ci naj­prv špe­ci­fi­ku­je cie­ľo­vý men­ný pries­tor a po­tom umies­tne­nie sché­my XML, kto­rá sa na da­ný men­ný pries­tor vzťa­hu­je: # De­fi­ne SCHÉMA "http://temp.org c: \ Ho­me \ Ca­che \ Tmp \ Per­son.xsd ". Po­tom už va­li­dá­cia pre­beh­ne tak, ako by sme oča­ká­va­li.

Ca­che TRM>3564 (CA­CHE20102RC)
XML­STU­DY>w ##class (XML.Utils.SAX) . va­li­da­te­Do­cu­ment ()
1
XML­STU­DY>

Ďal­šie za­ují­ma­vé di­ely se­riá­lu Ti­py a tri­ky s Ca­ché, kto­ré vy­chá­dza­jú už od ro­ku 2005, ­náj­de­te na stiah­nu­tie tu: http://www.inter­sys­tems.cz/edu­ca­tion/uni­ver­si­ty/se­ria­ly/ti­py­Tri­ky­Ca­che.html

Zdroj: Infoware 10/2011



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

Ke­dy naj­čas­tej­šie v prá­ci zneu­ží­va­me inter­net? Po obe­de pri ká­ve.
Ktoré rituály zamestnanci v práci nie sú schopní len tak si odoprieť? Kávu po obede a k nej internet na súkromné účely. čítať »
 
Prog­ra­mu­je­me GPU / 7. časť
Táto časť seriálu je začiatkom roz­siah­leho bloku, v ktorom opíšeme všetky základné aj rozšírené črty ­jazyka GLSL. čítať »
 
Fun­kcio­nál­ne prog­ra­mo­va­nie – Clo­ju­re
Matematika už niekoľko storočí používa na riešenie problémov funkcie. Matematická funkcia vyjadruje prepojenie medzi parametrami, t. j. vstupom a výsledkom. čítať »
 
24 tip: Va­li­dá­cia do­ku­men­tov XML op­ro­ti sché­me XML / Ti­py a tri­ky s Ca­ché
Pri svojej práci s dokumentmi XML sa môžete stretnúť s požiadavkou validácie XML oproti schéme. čítať »
 
Efek­tív­na tvor­ba ja­vo­vých (nie­len) webo­vých ap­li­ká­cií / Spring Fra­mework / 1. časť: Pred­sta­ve­nie
Spring momentálne určite patrí medzi najrozšírenejšie aplikačné frameworky. A ako to v ta­kých­to prípadoch býva, jeho popularita ho predurčuje na to, aby mal svoje skupiny fanatických priaznivcov a rovnako fanatických odporcov. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXIX
V úvodných častiach nášho seriálu sme prakticky ukázali jednu z možností, ako modelovať exteriér grafických enginov. čítať »
 
Ako stvo­riť An­droid / 6. časť: Biz­nis / Vý­voj ap­li­ká­cií pre mo­bil­né za­ria­de­nia
Možno vás podnadpis trochu uvedie do omylu. Námetom nebude vývoj „biznisových" aplikácií, teda aplikácií určených do podnikového prostredia... čítať »
 
Pok­ro­či­lé uda­los­ti / 5. časť / Tvor­ba inter­ak­tív­ne­ho webu s jQuery
Na začiatok vám predstavíme funkcie, ktoré slúžia na prepínanie elementov medzi dvoma stavmi. Prvá z takýchto funkcií je toggle(). čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter