Sveiki, antraštė turbūt keistai skamba šito forumo kontekste, bet jeigu aš susidūriau, tai gal ir dar kas nors susidūrė. Problema tokia, klientas integruojasi su mūsų sistema, bet bėda kad jis savo sistemą rašo su PHP ir jam reikia pasiimti informaciją iš XML dokumento, turint xsd schemą. .NET'e aš ne kartą dariau taip: su xsd.exe susigeneruoju klasę iš xsd failo, pasiredaguoju kiek man reikia ją rankomis ir tada tiesiog deserializuoju xml'ą į tos klasės instance. O įdomu kaip tą padaryti ir ar įmanoma su PHP, gal kam teko susidurti?
http://forums.devshed.com/xml-programming-19/validating-xml-against-xsd-with-php-430794.html
Na čia ne visai tai, čia yra xml validavimas pagal pateiktą schemą, o man reikėtų bindinimo.
Na facebook komanda parase Thrift http://developers.facebook.com/thrift/ . Jei as viska teisingai suprantu, tai galima savo xsd pakonvertuoti i thrift : http://tranchis.github.com/xsd2thrift/ . Tada thrift kompiliatoriaus pagalba butu galima sugeneruoti manau koda. Tiksliai nezinau ar as cia tiesa kalbu :) bet tokia ideja kilo. Kadangi man sito dalyko nereikejo tai patingejau pasigilinti ;)
Giedriau, ar radai sprendimą?
Sergejus: Giedriau, ar radai sprendimą?
Ne, naudojom xpath ir rankutemis mapinom.
Gal eitų prasisukti su XML data islands:
http://www.globalguideline.com/xml/XML_Data_Island.php
Aišku, pakankamai didelis apribojimas, kad veikia tik ant IE berods.
Edmundas: Gal eitų prasisukti su XML data islands: http://www.globalguideline.com/xml/XML_Data_Island.php Aišku, pakankamai didelis apribojimas, kad veikia tik ant IE berods.
Čia ne visai tas dalykas, apie ką kalbama.
Anyway, atsitiktinai suvokiau kame problema - pasirodo php bando tai daryti be xsd schemos, tiesiog ima xml ir večia jį į objektą:
http://www.php.net/manual/en/simplexml.examples-basic.php
Todėl kai ieškodavau bindinimo pagal xsd schemą kaip kad yra .NET, nugrybaudavau.
Todėl seka būtų tokia:
1) su DOMDocument užsikraunam xml ir patikrinam dokumentą pagal turimą schemą
2) su SimpleXml konvertuojam DOMDocument struktūrą į SimpleXML formatą
Netikrintas pavyzdys būtų:
function libxml_display_error($error){ $return = "<br/>\n"; switch ($error->level) { case LIBXML_ERR_WARNING: $return .= "<b>Warning $error->code</b>: "; break; case LIBXML_ERR_ERROR: $return .= "<b>Error $error->code</b>: "; break; case LIBXML_ERR_FATAL: $return .= "<b>Fatal Error $error->code</b>: "; break; } $return .= trim($error->message); if ($error->file) { $return .= " in <b>$error->file</b>"; } $return .= " on line <b>$error->line</b>\n"; return $return;}function libxml_display_errors() { $errors = libxml_get_errors(); foreach ($errors as $error) { print libxml_display_error($error); } libxml_clear_errors();}// Enable user error handlinglibxml_use_internal_errors(true);$xml = new DOMDocument();$xml->load('example.xml');if (!$xml->schemaValidate('schema.xsd')) { print '<b>DOMDocument::schemaValidate() Generated Errors!</b>'; libxml_display_errors();}else { $object = simplexml_import_dom($xml); // do your stuff here echo $object->book[0]->title;}
btw, komentaruose skaičiau, kad jeigu xml intensyviai naudoja namespace'us, SimpleXml turi problemų.