Nem a teljes xml fájl, csak egy részének a validálása

Fórumok

Hello!

Egy xml fájlt egy adott Schema ellenében validálni nem ügy. ;)

Van egy alkalmazásom amiben gyakran változik egy xml fájl, és
én épp ilyen gyakran szeretném validálni.
Mivel mindig tudom, hogy hol történt a változás, ezért olyan megoldást keresek,
amelyik lokálisan csak az érintett Node-ot illetve annak tartalmát validálja.
(A többiben úgysem történt változás.)
Persze, megtehetném, hogy az egész fájlt validálom, de nem akarom, hogy belassítsa a dolgokat...

Van valakinek valami ötelete? Ismer valaki olyan validatort ami ilyet tud?

Hozzászólások

Hát, nem tudom mennyire gyorsítaná észrevehetően a dolgokat. Legalább az adott node szülőjétől kell elindulni a validáláshoz, azt is kalkuláld bele, tehát maga az adott node nem elég.
Milyen validátort használsz? Nem ismerek olyan progit, amit keresel, de javasolnám a libxml részeként terjesztett xmllint programot, ha számít a sebesség. C-ben íródott, tehát gyors és támogat DTD, Schema és RELAX-NG validálást.

Talán van egy olyan flag Sax-ban, hogy XMLFragment, de most hirtelen nincs semmim ahol meg tudnám nézni.

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Mint fentebb irtak, eleg problemas ez, hiszen a sema definialja a parent child-jeinek a tipusat, tehat a parent node-tol kezdve kell validalj. Nomarmost, ha egy egyszintes dokumentumfad van, akkor effektiv sebessegdifferencia nem lesz a teljes doksi es a masik modszer kozt.

Amugy en amondo vagyok, hogy ha a te reszedrol tudod garantalni a valtozasok validitasat (ez teszt szinten ki kellene deruljon), akkor nem szukseges folyamatosan ellenorizgetni. Persze ehhez a bemeno adatokon eroteljes validalast kell vegrehajtani.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

>Nomarmost, ha egy egyszintes dokumentumfad van, akkor effektiv sebessegdifferencia nem lesz a teljes doksi es a masik modszer kozt.
Nem egyszintes dokumentumfám van. ;)

>Amugy en amondo vagyok, hogy ha a te reszedrol tudod garantalni a valtozasok validitasat (ez teszt szinten ki kellene deruljon), akkor nem szukseges folyamatosan ellenorizgetni.
Nem tudom garantálni. Épp ezért kell a validálás. ;)

Oke, kifejtem bovebben:

Szoval, ha a xml fragmentumot nem csak ugy kapod valahonnet, hanem te magad a ket szep kezecskeddel pakolaszod ossze, akkor elmeletben tudod garantalni az xml validitasat. Ha az xml fragmentumot valakitol atveszed, akkor viszont - fuggoen attol, hogy egy vagy tobb node-t veszel at - az atvett adatot kell validalni, nem pedig a kiirando adatot. Ha tobb node-t veszel at, akkor regex-szel szetszeded, es a node-kat kulon-kulon levalidalod, csak neked kell osszetenni a semat hozza, hogy az legyen a gyoker, amit szeretnel.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Arra gondolsz, hogy:

-adott egy node, amit validálni szeretnék.
-adott egy schema a teljes xmlhez.

amit csinálok:
-kiveszem a schema-ból azt a részt ami az adott node-ra vonatkozik, és új schémát csinálok belőle, mintha node lenne a root elem
-validálom az új schémával a node-ot

Ha erre akartál célozni, hát ez is költséges lehet... attól függ persze, hogy a schémát mennyire nehéz átszabni. Erről tudsz valamit mondani?

Csak hogy jobban érts: egy xml editort kezdtem el csinálni. Tehát kezdetben van egy xml fájl ami valid. A user egy xml fragmentumot megváltoztat, és én a módosított xml fragmentumot akarom validálni.

XSLT-vel esetleg átszabni a sémát? Gondolom meg lehet csinálni, bár csak alapokkal vagyok tisztában XSLT-vel...

Amúgy az xmllintről, amit fentebb említettem még annyit, hogy 13K soros doksit ilyen hamar validál le:
> /usr/bin/time -h xmllint --noent --valid --noout book.xml
0.17s real 0.11s user 0.05s sys
> wc -l book.xml
13150 book.xml

Lehet nem éri meg ennyit szenvedni a fragmentekkel, ha mindez ilyen hamar megvan. Nyílván lineáris idejű a validálási algoritmus, ezért még egy 130K soros fájlon is elhanyagolható a validálási idő. Szerintem több időt vesztesz a fragmentált validálással, amíg a szkripted összedobálja a cuccokat és levalidálja a fragmentet.