(PECL yaml >= 0,4,0)
yaml_parse — Analyzuje tok YAML
yaml_parse (string $vstup [, int $pos = 0 [, int &$ndocs [, pole $spätné volania = NULL ]]]) : zmiešané
Skonvertuje celý alebo časť prúdu YAML a zapíše ho do premennej.
Linka na analýzu ako tok YAML.
Dokument na analýzu ( -1 pre všetky dokumenty, 0 pre prvý dokument, ...).
Ak sa nájde ndocs, nahradí sa počtom dokumentov v streame YAML.
Vráti hodnotu zakódovanú vo vstupe v príslušnom type PHP resp FALSE v prípade chyby. Ak pos parameter rovná sa -1 , vráti sa pole obsahujúce jednu položku pre každý dokument nájdený v streame.
Príklad #1 Príklad použitia yaml_parse()
$yaml =<<
faktúra: 34843
dátum: "2001-01-23"
fakturovať: &id001
dané: Chris
rodina: Dumars
adresa:
riadky: |-
458 Walkman Dr.
Suita č. 292
mesto: Royal Oak
stav: MI
pošta: 48046
stránka: zxibit.esy.es
dodacia adresa: *id001
produkt:
- sku: BL394D
množstvo: 4
popis: Basketbal
cena: 450
- sku: BL4438H
množstvo: 1
popis: Super Hoop
cena: 2392
daň: 251,420000
spolu: 4443,520000
komentáre: Najlepšie je neskoro popoludní. Záložný kontakt je Nancy Billsmer @ 338-4338.
...
EOD;
$parsed = yaml_parse ($yaml);
var_dump ($parsed);
?>
Výsledkom spustenia tohto príkladu bude niečo také:
array(8) ( ["faktúra"]=> int(34843) ["dátum"]=> string(10) "2001-01-23" ["bill-to"]=> &array(3) ( [" dané"]=> reťazec(5) "Chris" ["rodina"]=> reťazec(6) "Dumars" ["adresa"]=> pole(4) ( ["riadky"]=> reťazec(34) " 458 Walkman Dr. Suite #292" ["city"]=> string(9) "Royal Oak" ["state"]=> string(2) "MI" ["postal"]=> int(48046) ) [ "ship-to"]=> &array(3) ( ["dané"]=> string(5) "Chris" ["rodina"]=> string(6) "Dumars" ["address"]=> pole ( 4) ( ["lines"]=> string(34) "458 Walkman Dr. Suite #292" ["city"]=> string(9) "Royal Oak" ["state"]=> string(2) " MI" ["postal"]=> int(48046) ) ) ["product"]=> array(2) ( => array(4) ( ["sku"]=> string(6) "BL394D" [ " množstvo"]=> int(4) ["popis"]=> string(10) "Basketbal" ["cena"]=> int(450) ) => pole(4) ( ["sku"]=> reťazec (7) "BL4438H" ["množstvo"]=> int(1) ["popis"]=> reťazec(10) "Super Hoop" ["cena"]=> int(2392) ) ["daň" ] => float(251,42) ["total"]=> float(4443,52) ["comments"]=> string(68) "Najlepšie je neskoro popoludní. Záložný kontakt je Nancy Billsmer @ 338-4338.")
Prišiel deň a konfiguračné súbory pretože naša aplikácia bola taká veľká, že manažéri naznačili, že konfigurácie JSON obsahujú podozrivo veľké množstvo zložených a nezložených zátvoriek a chceli by sa ich zbaviť. Jemne naznačil, že by bolo fajn pozrieť sa na YAML bližšie, pretože kolujú reči, že je veľmi ľudsky čitateľný. A nie sú tam žiadne zátvorky. A zoznamy sú krásne. Prirodzene, nedalo sa nepočúvať starších, boli sme nútení študovať problematiku, hľadať rozdiel, klady a zápory oboch formátov. Je zrejmé, že takéto porovnávania sa začínajú len preto, aby potvrdili názor manažérov, alebo ak sa aj nepotvrdia, zistia, prečo majú pravdu a prečo sa oplatí robiť zmeny :)
Som si istý, že mnohí poznajú tieto formáty, ale aj tak to dám stručný popis z Wikipedie:
JSON (JavaScript Object Notation) je formát výmeny textových údajov založený na JavaScripte a bežne používaný v tomto jazyku. Rovnako ako mnoho iných textových formátov, aj JSON je pre ľudí ľahko čitateľný. Napriek svojmu pôvodu v JavaScripte (presnejšie z podmnožiny jazyka normy ECMA-262 z roku 1999) sa formát považuje za jazykovo nezávislý a možno ho použiť s takmer akýmkoľvek programovacím jazykom. Pre mnohé jazyky existuje pripravený kód na vytváranie a spracovanie údajov vo formáte JSON.
YAML je ľudsky čitateľný formát serializácie údajov, koncepčne blízky značkovacím jazykom, ale zameraný na pohodlie vstupu a výstupu typických dátových štruktúr mnohých programovacích jazykov. Názov YAML je rekurzívny akronym pre YAML Ain't Markup Language („YAML nie je značkovací jazyk“). ”) a bol dokonca považovaný za konkurenta XML, no neskôr bol premenovaný, aby zvýraznil údaje, a nie označenie dokumentu.
Čo teda potrebujeme:
Je zrejmé, že nebudeme písať vlastné syntaktické analyzátory, takže najskôr vyberieme pre každý formát existujúci analyzátor.
Pre json použijeme gson (z google) a pre yaml použijeme snakeyaml (od neviem koho).
Ako vidíte, všetko je jednoduché, stačí vytvoriť pomerne zložitý model, ktorý bude simulovať zložitosť konfiguračných súborov, a napísať modul, ktorý bude testovať parsery yaml a json. Začnime.
Potrebujete model približne tejto zložitosti: 20 atribútov rôzne typy+ 5 kolekcií po 5-10 prvkov + 5 vnorených objektov po 5-10 prvkov a 5 kolekcií.
Túto fázu celého porovnania možno pokojne nazvať najviac nudnou a nezaujímavou. Triedy boli vytvorené s tichými názvami ako Model, Emdedded1 atď. Nenaháňame však čitateľnosť kódu (aspoň v tejto časti), takže to necháme tak.
súbor.json
"embedded2": ( "strel1": "el1", "strel2": "el2", "strel4": "el4", "strel5": "el5", "strel6": "el6", "strel7": " el7", "intel1": 1, "intel2": 2, "intel3": 3, "zoznam1": [ 1, 2, 3, 4, 5 ], "zoznam2": [ 1, 2, 3, 4, 5, 6, 7 ], "zoznam3": [ "1", "2", "3", "4" ], "zoznam4": [ "1", "2", "3", "4", "5", "6" ], "map1": ( "3": 3, "2": 2, "1": 1), "mapa2": ( "1": "1", "2": "2", "3": "3"))
súbor.yml
vložené2: intel1: 1 intel2: 2 intel3: 3 zoznam1: - 1 - 2 - 3 - 4 - 5 zoznam2: - 1 - 2 - 3 - 4 - 5 - 6 - 7 zoznam3: - "1" - "2" - "3" - "4" zoznam4: - "1" - "2" - "3" - "4" - "5" - "6" mapa1: "3": 3 "2": 2 "1": 1 map2: 1: "1" 2: "2" 3: "3" strel1: el1 strel2: el2 strel4: el4 strel5: el5 strel6: el6 strel7: el7
yaml analyzátor
public class BookYAMLParser implementuje Parser
analyzátor json
public class BookJSONParser implementuje Parser
Ako vidíme, oba formáty sú podporované v jazyku Java. Ale pre json je výber oveľa širší, to je nepopierateľné.
Parsery sú pripravené, teraz sa pozrime na implementáciu porovnania. Aj tu je všetko mimoriadne jednoduché a zrejmé. Existuje jednoduchá metóda, ktorá deserializuje objekty zo súboru 30-krát. Ak by mal niekto záujem, kód je pod spojlerom.
testovací kód
public static void main(String args) ( String jsonFilename = "file.json"; String yamlFilename = "file.yml"; BookJSONParser jsonParser = new BookJSONParser(jsonFilename); jsonParser.serialize(new Book(new Author("name",") "123-123-123"), 123, "dfsas")); , "dfsas")); //deserializácia json StopWatch stopWatch = new StopWatch.start();< LOOPS; i++) { Book e = jsonParser.deserialize(); } stopWatch.stop(); System.out.println("json worked: " + stopWatch.getTime()); stopWatch.reset(); //yaml deserialization stopWatch.start(); for (int i = 0; i < LOOPS; i++) { Book e; e = yamlParser.deserialize(); } stopWatch.stop(); System.out.println("yaml worked: " + stopWatch.getTime()); }
V dôsledku toho dostaneme nasledujúci výsledok:
json pracoval: 278 yaml pracoval: 669
Ako vidíte, súbory json sa analyzujú približne trikrát rýchlejšie. Ale absolútny rozdiel nie je v našom meradle kritický. Preto to nie je silné plus v prospech json.
Stáva sa to preto, že json sa analyzuje za chodu, to znamená, že sa číta znak po znaku a okamžite sa uloží do objektu. Ukazuje sa, že objekt je vytvorený v jednom prechode cez súbor. V skutočnosti neviem, ako presne tento parser funguje, ale všeobecná schéma takto.
A yaml je zasa odmeranejší. Fáza spracovania údajov je rozdelená do 3 etáp. Najprv sa vytvorí strom objektov. Potom sa to nejakým spôsobom transformuje. A až po tejto fáze sa prevedie na potrebné dátové štruktúry.
Malý porovnávacia tabuľka("+" - výhoda, "-" - oneskorenie, "+-" - žiadna zjavná výhoda):
Ako sa to dá zhrnúť?
Všetko je tu zrejmé, ak je pre vás dôležitá rýchlosť - potom json, ak ľudská čitateľnosť - yaml. Musíte sa len rozhodnúť, čo je dôležitejšie. Pre nás to bolo druhé.
V skutočnosti možno v prospech každého z formátov uviesť oveľa viac rôznych argumentov, ale verím, že tieto dva body sú stále najdôležitejšie.
Ďalej, pri práci s yaml som sa musel vysporiadať s nie veľmi pekným spracovaním výnimiek, najmä keď syntaktické chyby. Tiež som musel testovať rôzne knižnice yaml. Nakoniec bolo potrebné napísať nejaké potvrdenie. Vyskúšali sme overenie pomocou schém (kde sme museli volať drahokamy Ruby) a overenie fazule založené na jsr-303. Ak vás niektorá z týchto tém zaujala, rád odpoviem na vaše otázky.
Ďakujem za pozornosť :)
P.S.
Na konci písania článku som narazil na nasledujúce porovnanie yaml a json.
1. V zozname produktov kliknite na "Nahrať"
Po nahratí produktov do syntaktického analyzátora na stránke so zoznamom produktov kliknite na tlačidlo „Nahrať“.
2. Nastavte nastavenia formátu
V zobrazenom okne vyberte formát "Yandex.Market (YML)" a nastavte nastavenia formátu: ako nahrať charakteristiky a samostatné vlastnosti.
Podrobný popis každého nastavenia nájdete nižšie na tejto stránke.
3. Nahrávanie začalo
Zobrazí sa indikátor vykládky tovaru. Ak nechcete čakať, môžete vypnúť počítač alebo zavrieť prehliadač – sťahovanie bude pokračovať bez ohľadu na vás.
YML (Yandex Market Language) je štandard vyvinutý spoločnosťou Yandex na prijímanie a umiestňovanie informácií do databázy Yandex.Market. YML je založený na štandarde XML.
Generovať ID ponuky z— umožňuje vybrať spôsob vytvorenia atribútu id tagu ponuky, ktorý určuje ID ponuky produktu.
Samostatné multi-vlastnosti— umožňuje zvoliť spôsob rozdelenia vybraných vlastností (veľkosti, farby atď.): buď na základe opakujúceho sa tagu param, alebo na základe rozdelenia ponuky na jednotlivé produkty podľa group_id, podľa špecifikácie YML.
Produkty sú vypredané— môžete nastaviť, ako sa budú produkty “Vypredané” zobrazovať na trhu: Na objednávku, t.j. s možnosťou objednať alebo úplne vypredané.
Vyložiť tovar— umožňuje vám vybrať, ktoré produkty sa majú vyložiť na základe „Dostupnosti“ na webovej stránke dodávateľa.
Postup pri vykládke tovaru— umožňuje zvoliť poradie vykládky tovaru a v prípade potreby nastaviť vykládku dozadu.
Povoliť značenie HTML v poliach produktov— povolí alebo zakáže značenie HTML v produktových poliach. Veľmi zriedka používané internetovými obchodmi.
Nahrávanie obrázkov— umožňuje zmeniť počet alebo spôsob nahrávania obrázkov.
Vlastnosti nahrávania— umožňuje nahrať vlastnosti produktu (farby, veľkosti atď.) ako samostatné polia v súbore alebo ich jednoducho pridať všeobecný popis tovar. Po pridaní do popisu zostanú samotné stĺpce. Vyberá sa v závislosti od možností vášho internetového obchodu alebo webovej stránky spoločného podniku.
Rozdeliť do viacerých súborov— umožňuje rozdeliť nahrávanie do niekoľkých súborov: podľa kategórie alebo značky.
Ak nájdete chybu vo formáte nahrávania Yandex.Market (YML), oznámte nám to na alebo prostredníctvom chatu na webovej stránke. Nahrávanie sa pokúsime opraviť čo najskôr.
Doplnok vám umožňuje importovať produkty z iných obchodov cez XML feed Yandex, ktorý používajú obchody na obchodovanie na Yandex.Market.
Produkty sa importujú do štruktúry pluginu WP Shop. Nechýba automatická synchronizácia produktov so zdrojom, ktorú je možné spustiť buď manuálne alebo cez cron.
Nevyhnutný nástroj pre:
1. Prenos obchodu z akýchkoľvek iných motorov do WordPress WP-Shop
2. Budovanie affiliate obchodov na zarábanie peňazí na affiliate províziách pomocou modelu CPS
Aplikácia vyžaduje na fungovanie IonCube Loader!
Pomoc nájdete na stránke wp-shop.ru.
Za žiadnych okolností týchto vývojárov nekontaktujte ani od nich nič nekupujte. Funkčnosť, ktorú sľubujú v profesionálnej verzii, je lož. Jednoducho vám vezmú peniaze a potom odmietnu všetko vrátane podpory. Stačí si pozrieť ich pokrivený web a položivotnú dokumentáciu a všetko pochopíte sami!
Verzia: 0.9
-projekt_ako_pole
-id_as_field
Verzia: 0.8
-template_price (vlastná cenovka)
Verzia: 0.7
-fields_update — nové nastavenie na aktualizáciu vlastných polí v projektoch
Verzia: 0.6
-Ukážkový xml analyzátor nahradený analyzátorom SAX, ktorý je lepší pre správu pamäte
Verzia: 0.5
-vylepšenia
Verzia: 0.4
- hromadná analýza
- klonovať projekt podľa kategórie
Verzia: 0.3
-odkaz na dokumenty
Verzia: 0.2
- povoliť miestne kanály
- zdroj ako súbor povoliť
- možnosti pridania yml
Verzia: 0.1
- prvé uvoľnenie
Testovanie prístroja, konfiguračné súbory a protokolové súbory by mali byť čitateľné človekom. YAML (YAML Not Markup Language) má menej podrobných údajov ako formát serializácie XML a medzi vývojármi sa stal obľúbeným formátom. softvér hlavne preto, že je to pre človeka jednoduchšie. Súbory YAML sú jednoduché textové súbory, obsahujúci údaje zapísané v súlade s pravidlom syntaxe YAML a spravidla má príponu súboru .yml. V tomto článku sa naučíte základy YAML a ako môžete integrovať PHP YAML parser do vašich projektov.
YAML podporuje pokročilé funkcie, ako sú referencie a vlastné dátové typy, ale ako vývojára PHP vás väčšinou bude zaujímať, ako YAML predstavuje enumerované polia (sekvencie v terminológii YAML) a asociatívne polia (mapovania).
Tu je návod, ako je enum reprezentovaný v poli YAML:
- "William O'Neal" - nepravda
Každý prvok poľa je uvedený za pomlčkou a medzerou. Jeho syntax na reprezentáciu hodnôt je podobná ako v PHP (citovanie reťazcov atď.)
Vyššie uvedené je ekvivalentné nasledujúcemu PHP:
Typicky sa každý prvok v YAML zobrazuje na samostatnom riadku, ale uvedené polia môžu byť vyjadrené na jednom riadku pomocou zátvoriek:
[ 2, "William O'Neal", nepravda ]
Nasledujúci kód ukazuje, ako je asociatívne pole reprezentované v YAML:
Id: 2 name: "William O'Neal" isActive: false
Prvý kľúč prvku určuje dvojbodku a jednu alebo viac medzier a potom je špecifikovaná hodnota. Stačí mať za dvojbodkou len jednu medzeru, ale ak chcete, môžete použiť viac miesta pre lepšiu čitateľnosť.
Ekvivalentné pole PHP vyššie uvedeného YAML je:
2, "name" => "William O"Neal", "isActive" => false);?>
A podobne ako uvedené polia, môžete vyjadriť asociatívne polia na jednom riadku pomocou kučeravé zátvorky:
( id: 2, meno: "William O'Neal", isActive: false )
S jedným alebo viacerými medzerami na odsadenie môžete reprezentovať viacrozmerné pole takto:
Nad blokom YAML je to ekvivalentné nasledujúcemu PHP:
array(0 => array("id" => 1, "name" => "Brad Taylor", "isActive" => true), 1 => array("id" => 2, "name" => " William O"Neill", "isActive" => nepravda)));?>
YAML vám tiež umožňuje reprezentovať kolekciu dátových prvkov v jednom dokumente bez potreby koreňového uzla. Nasledujúci príklad obsahuje obsah article.yml, ktorý zobrazuje viacero viacrozmerných polí v jednom súbore.
Autor: 0: ( id: 1, meno: "Brad Taylor", isActive: true ) 1: ( id: 2, name: "William O"Neal", isActive: false ) kategória: 0: ( id: 1, name : "PHP" ) 1: ( id: 2, názov: "YAML" ) 2: ( id: 3, názov: "XML" ) článok: 0: id: 1 nadpis: "Ako používať YAML v projekte PHP" obsah: > YAML je menej podrobný formát serializácie údajov Za ním je „YAML nie je značkovací jazyk“. : 0 : ( ID článku: 1, ID kategórie: 1 ) 1: ( ID článku: 1, ID kategórie: 2 )
Zatiaľ čo väčšina syntaxí YAML je intuitívna a ľahko zapamätateľná, je potrebné venovať pozornosť jednému dôležitému pravidlu. Zarovnanie sa musí vykonať s jednou alebo viacerými medzerami; Tabule nie sú povolené. IDE môžete nakonfigurovať tak, aby pri stlačení klávesu tabulátora vložilo medzery namiesto tabulátorov, čo je bežná konfigurácia medzi vývojármi softvéru, aby sa zabezpečilo, že kód bude správne odsadený a zobrazí sa pri prezeraní v iných editoroch.
Viac pokročilých funkcií a syntaxe a toho, čo YAML podporuje, sa môžete dozvedieť v oficiálnych dokumentoch, Symfony alebo Wiki.
Ak skúmate YAML so svojím milovaným vyhľadávač, ste nepochybne na tému "YAML vs XML", a prirodzene, keď prvýkrát uvidíte YAML, budete ho vo všeobecnosti uprednostňovať pred XML, pretože sa ľahšie číta a píše. YAML by však mal byť stále jedným z nástrojov pre vývojárov arzenálu a nemal by byť alternatívou k XML. Tu sú niektoré výhody YAML a XML.
Výhody YAML
Výhody XML
Hoci je XML podrobný, je čitateľnejší a udržiavateľnejší, keď je hierarchia prvkov hlboká v porovnaní s priestorovou reprezentáciou hierarchie YAML.
Vzhľadom na výhody v oboch jazykoch sa YAML javí ako vhodnejší na zber rôznych dátových množín a keď sú ľudia aj jedným z konzumentov dát.
Analyzátor YAML má dva funkčnosť, druh záťaže pre funkciu, ktorá konvertuje YAML na pole, a funkciu výpisu, ktorá konvertuje pole na YAML.
V súčasnosti ide o PHP YAML parser, ktorý je dostupný ako rozšírenie PECL a nie je súčasťou PHP. Okrem toho existujú analyzátory napísané v čistom PHP, ktoré by bolo v porovnaní s rozšírením PECL o niečo pomalšie.
Nižšie sú uvedené niektoré analyzátory YAML pre PHP:
Dávam prednosť výberu komponentov YAML Symfony 1.4 kvôli prenosnosti (funguje s PHP 5.2.4+) a využiteľnosti (nainštalované Symfony 1.4 a PHP framework). Po rozbalení archívu YAML komponentov Symfony sú triedy YAML dostupné pod lib/yaml. Statické metódy load() a dump() sú dostupné z triedy sfYaml.
Kedykoľvek potrebujete integrovať triedu alebo knižnicu tretej strany do svojho projektu PHP, je dobrým zvykom vytvoriť obal a testy. Zmena knižnice tretej strany s minimálnymi zmenami v kóde projektu (na kód projektu by sa mal vzťahovať iba shell) a s istotou, že zmeny nespomalia žiadnu funkcionalitu (testy).
Nižšie je uvedený test (YamlParserTest.php), ktorý bol vytvorený pre triedu obalu (YamlParser.php). Vyžaduje sa na spustenie a udržiavanie testu. Ak chcete, môžete pridať viacero testov pre neplatné názvy súborov a prípony súborov iné ako .yml a ďalšie testy založené na skriptoch, s ktorými sa stretnete vo svojom projekte.
yamlParser = new YamlParser();"; $content = "YAML is a less-verbose data serialization format. " . "It stands for \"YAML Ain"t Markup Language\". " . "YAML has been a popular data serialization format among " . "software developers mainly because it"s human-readable.\n"; $expectedArticle = array("id" => 1, "title" => $title, "content" => $content, "author" => 1, "status" => 2); $this->assertEquals($expectedArticle, $actualArticle); } /** * @expectedException YamlParserException */ public function testExceptionForWrongSyntax() { $this->yamlParser->load("wrong-syntax.yml"); } }?> !}
) verejná funkcia testMainArrayKeys() ( $parsedYaml = $this->yamlParser->load("článok.yml"); $mainArrayKeys = array_keys($parsedYaml); $expectedKeys = array("autor", "kategória", "článok" ", "articleCategory"); $this->assertEquals($expectedKeys, $mainArrayKeys); ) verejná funkcia testSecondLevelElement() ( $parsedYaml = $this->yamlParser->load("article.yml"); $actualArticle = $ parsedYaml["článok"]; $title = "Ako používať YAML vo svojom ďalšom projekte PHP
A tu je trieda obalu:< 0) { parent::__construct($message, $code); } else { parent::__construct($message, $code, $previous); } } }?>
getMessage(), $e->getCode(), $e); ) ) výpis verejnej funkcie ($array) ( try ( return sfYaml::dump($array); ) catch (Exception $e) ( throw new YamlParserException($e->getMessage(), $e->getCode(), $e ) ) ) class YamlParserException rozširuje výnimku ( verejná funkcia __construct($správa = "", $kód = 0, $previous = NULL) ( if (version_compare(PHP_VERSION, "5.3.0")); Takže teraz máte vedomosti o tom, čo je YAML a ako ho reprezentovať