Hgyvk: docx to XML generátor leírás


HGYVK .docx konvertáló program XML-be

Leírás/Magyarázat/Történet



Hgyvk - docx to XML generator logo

A történet ott kezdődött, hogy egy könyvtár cégtől, nevezetesen a HGYVK-tól kapunk havi szinten 50-100-150 vagy még több könyvet egy docx dokumentumban táblázatosan elrendezve, amit nekünk kell egyesével feltölteni a weboldalra az Ordasoft Booklibrary komponensébe.
Már kezdetek kezdetén elgondolkoztam rajta, hogy ezt vajon nem lehetne automatizálni valahogy. Elmélkedtünk kollégával, hogy egyszerűbb lenne, ha megkérnénk a táblázat készítőjét, hogy xls/xlsx-be készítse el, és azt már könnyű csv-be konvertálni, amit már könnyebb átalakítani. Aztán ez valahogy annyiba maradt, de én később úgy döntöttem megpróbálom kinyerni az adatokat a docx táblázataiból, beolvastatni xml-be, és onnan már jöhet az import és kész is.

Elég is ennyi a történetből...
Mivel nem nagyon volt ötletem merre érdemesebb elindulni az AI-hoz fordultam, leírtam neki a helyzetet, és egyből is adta a kis python kódot, ami szépen beolvasta a docx-et, végigjárta a táblázatokat, kinyerte az adatokat, és már csak finomítgatni kellett.
Eljutottam odáig, hogy kiszedte a megfelelő adatokat, és legenerálta az első értelmesnek tűnő xml fájlt. Meg is próbáltam a booklibrary-ban importálni, és itt jöttek a buktatók. A Booklibrary import/export menüpontja inkább csak arra van kihegyezve, ha egyik weboldalról a másikra akarjuk átvinni az adatokat, vagy költöztetni akarjuk a könyv/szerző... adatainkat. Vagyis a kiexportált pl kategóriához minden adatot lement xml/csv fileba, és vissza import-nál szépen ott is van a könyv, a szerző, a kapcsolati adatok így minden szuper, csak nekem pont nem ez kellett, hanem nekem az xml feltöltésekor kellett volna a "<authors>"-ből kiszedni a szerzőt, leellenőrizni, hogy van-e már ilyen az adatbázisban, ha van kinyerni az ID-ját, ha nincs felvenni újként, és kivonni az azonosítóját, majd feltölteni a könyvet, kinyerni annak is az ID-ját és ezt felvinni a kapcsolati táblázatba, ami ugye összekapcsolja a könyveket a szerzőkkel. De sajnos ezt az ordasoft nem oldotta meg. Így hát nyomoztam, debugoltam, kutakodtam vajon melyik fájljuk végzi az import/export-ot és abban mi mit csinál. Mire rátaláltam, hogy a "/administrator/components/com_booklibrary" mappában található a "admin.booklibrary.class.impexp.php" nevű php fájl, azon belül is a 443. sor környékén található "importBooksXML" függvény végzi az import műveletet, így azt kellett szerkesztenem. Itt nem nagyon értem miért van ez a verzió ellenőrzés, de én hozzátettem hogy ha nagyobb mint 3.6, akkor is lefusson, nekem csak az a lényeg, hogy ez fusson le, így kiszedi a szerőmet az xml-ből. MAjd jött az adatbázis művelet, amihez nem használtam a booklibrary saját függvényeit, mert az feldarabolja "," karakterenként a stringet, nekem arra nincs szükségem (habár lehet a későbbiekben belerakom még ezt is), elég ha megnézi megvan-e a szerző, ha nincs felveszi és elmenti az ID-ját. Majd az alap könyv feltöltése jön, amit nem bántottam, és utána nekem még kellett a szersző és a könyv összekötése az "authors_connect" táblába. Itt is volt egy függvény, ami lefut, ha a J verzió kisebb mint 3.6, aminek még mindig nem tudom mi a jelentősége, de hagytam, és egy else ágba beleraktam a sakát kódomat, ami a kapott szerő ID-t és a könyv ID-t összekapcsolja, és lám, minden szuper is.

Sokat teszteltem, küszködtem még a képek hozzárendelésével is. Ugye abban szerencsénk van, hogy próbálják a képeket úgy elnevezni, ami a könyv címe, ami már egy nagyon jó kiindulópont, de feltöltéskor ugye a Joomla ékezettelenít, akkor ezt nekem is már úgy kellett az xml-be raknom. Illetve volt több tesztem a "-", "_", "." és a " " karakterek miatt, de talán most már azt is jól elvégzi. Így ha feltöltöm az xml-t már csak a képeket kell felraknom a "/components/com_booklibrary/covers/" mappába, egy ellenőrzés, javítás, ha mégis valami rossz, és lehet örülni, hogy ezt a sok "unalmas/altató" munkát pár kattintással elintézhetjük.


Frissítés: 0.1 Az ISBN szám ellenőrzést is beletettem, így ha valahol hiányzik ez a szám, ami ugye kötelező a feltöltéshez, akkor azonnal leáll a script és figyelmeztet, hogy melyik "sorban", melyik könyvnél hiányzik ez a szám.
Továbbá a könyv képének meglétét is ellenőrzöm. Habár elégé hamar megtalálja a képet, a tesztek alapján, ha egy könyv címe pl.: "Bosszú" akkor már a "valami boss valami.jpg" nevű képet hozzárendeli, ami lehet fog problémát okozni a későbbikben, ha eléggé azonos nevű könyvekről lesz szó, de ezt majd akkor a későbbiekben javítom.


Csatolok képeket a programról, plusz a programot is felrakom letölthető formában. A konkrét python kódot nem rakom fel, de ha valakit esetleg mégis érdekelne, vegye fel velem a kapcsolatot és megbeszéljük...

Manjaro Linux printscreen a programról

Képernyőkép a linuxon futó programról!

Letöltések:




A booklibrary php függvény módosítása, kommentelve:

<?php
static function importBooksXML($catid, &$dom, &$new_categories,&$new_authrs,&$numversion){
        global $database;

        $retVal = array();

        $book_list = $dom->getElementsByTagName('book');

        for ($i = 0;$i < $book_list->length;$i++) {
            
            $book_xml = $book_list->item($i);
          
            //echo mosBooklibraryImportExport::getXMLItemValue($book_xml,'bookid');
            $book = new mosBooklibrary($database);
            //get BookID
            $book->bookid = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'bookid');
            
            //get ISBN
            $book->isbn = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'isbn');
          
            //get Title(book)
            $book->title = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'title');

            //XENO SETTING PLUSZ EGY || FELTETEL HOGY AKKOR IS LEFUSSON EZ A KÓD, HA A VERSION NAGYOBB MINT 3.6, 
            // MERT EZ KELL HOGY KIOLVASSA AZ AUTHOR/SZERŐ NEVET
            if ($numversion[0] < 3.6 || $numversion[0] > 3.6) {
                //get Authors
                $book->authors = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'authors');
            }            
            //get Manufacturer
            $book->manufacturer = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'manufacturer');
            //get releasedate
            $book->release_Date = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'releaseDate');
            //get language
            $book->language = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'language');
            $book->langshow = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'langshow');
            if ($book->langshow == "") $book->langshow = "*";
            //get hits
            $book->hits = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'hits');
            $book->user_name = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'user_name');
            //get featured_clicks
            $book->featured_clicks = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'featured_clicks');
            //get featured_shows
            $book->featured_shows = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'featured_shows');
            //get rating
            $book->rating = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'rating');
            //get price
            $book->price = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'price');
            //get priceunit
            $book->priceunit = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'priceunit');
            //get URL
            $book->URL = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'url');
            //get imageURL
            $book->imageURL = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'imageURL');
            //get edition
            $book->edition = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'edition');
            //get ebookURL
            $book->ebookURL = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'ebookURL');
            //get informationFrom
            $book->informationFrom = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'informationFrom');
            if ($numversion[0] == 3.5) {
                //get author id
                $book->fk_authors = mosBooklibraryImportExport::checkid($book->authors);
            }
            //get date
            $book->date = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'date');
            //get fk_lendid
            // $book->fk_lendid = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'fk_lendid');
            //get published
            $book->published = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'published');
            //get comment
            $book->comment = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'comment');
            //get numberOfPages
            $book->numberOfPages = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'numberOfPages');
            $book->comment = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'comment');
            //get email owner book
            $book->owneremail = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'owneremail');
            //get owner_id owner book
            $book->owner_id = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'owner_id');
            $book->vm_id_product = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'vm_id_product');
            if($book->vm_id_product == "" ) $book->vm_id_product = 0 ;
            $book->metadata = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'metadata');
            $book->publish_up = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'publish_up');
            $book->publish_down = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'publish_down');
            if ($catid === null) {
                //get associate_book
                $book->associate_book = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'associate_book');
            }
            //get Categories
            if ($catid != "0" && $catid != "") { 
                $book->categs = array($catid);
            } else {
                $categ = $book_xml->getElementsByTagName('categ');

                $arrcatid = array();
                foreach($categ as $cattemp) { 
                    $category_book_old_id = $cattemp->nodeValue; 
                    foreach($new_categories as $new_category) { 
                        if ($new_category->old_id == $category_book_old_id) {
                            $arrcatid[] = $new_category->id;
                        }
                    }
                }
                $book->categs = $arrcatid;
            }

            //get Authors
            //XENO: ITT MEGKAPOM A SZERZŐ NEVÉT AZ XML BŐL
            $authors_names = $book->authors;
            
            if ($numversion[0] >= 3.6) 
            {

                $authors_id = $book_xml->getElementsByTagName('author_id');
              
                $arrauthorid = array();
                $result = null;
                foreach($authors_id as $avtor1) { 
                    $author_book_old_id = $avtor1->nodeValue; 
                    foreach($new_authrs as $new_authr) { 
                        if ($new_authr->old_id == $author_book_old_id) {
                          
                            $database->setQuery("SELECT id FROM #__booklibrary_authors  
                                     WHERE authors_name = '$new_authr->authors_name'");
                            $result = $database->loadResult();
                            if ($result) {
                                
                                if( !in_array( $result ,$arrauthorid) ) $arrauthorid[] = $result;
                            } else {
                                
                                if( !in_array( $new_authr->id ,$arrauthorid) ) $arrauthorid[] = $new_authr->id;
                                if($authors_names == "") $authors_names = $new_authr->authors_name ;
                                else $authors_names .= ", " . $new_authr->authors_name ;
                            }
                        }
                    }
                }
                $book->authors = $arrauthorid;
            }

            //XENO: AUTHOR STORE
            global $database;
            $my_author_id = 0; //XENO: Ebbe a változóba kerül az Author ID
            $authorNameForDb = trim($authors_names); //XENO: A korábban kinyert név

            if (!empty($authorNameForDb)) {
            //XENO: Biztonságos stringgé alakítjuk az SQL-hez
            $escapedName = $database->escape($authorNameForDb);

            //XENO: Ellenőrizzük, létezik-e már pontosan ez a szerző
            $database->setQuery("SELECT id FROM #__booklibrary_authors WHERE authors_name = '$escapedName'");
            $my_author_id = $database->loadResult();

            //XENO: Ha nem létezik, felvesszük az adatbázisba
            if (!$my_author_id) {
                $database->setQuery("INSERT INTO #__booklibrary_authors (authors_name) VALUES ('$escapedName')");
                $database->execute();
                $my_author_id = $database->insertid(); //XENO: Visszakapjuk a friss ID-t
            }
        }
    
        $book_ID = $book->bookid = 1 + $book->getMaxBookid();
          
        $tmp[] = $i;
        $tmp[] = $book_ID;
        $tmp[] = $book->isbn;
        $tmp[] = $book->title;
        $tmp[] = $my_author_id; //XENO: ITT MÁR MEGVAN AZ ADATBÁZISBÓL A MEGLÉVŐ/ÚJ SZERŐ ID
        $tmp[] = $book->manufacturer;

        if (!$book->check()) {
            $tmp[] = $book->getError();
            $retVal[$i] = $tmp;
            unset($tmp);
            unset($book);
            continue;
        }
        if (!$book->store()) {
            
            $tmp[] = $book->getError();
            $retVal[$i] = $tmp;
            unset($tmp);
            unset($book);
            continue;
        } else {
            
            $book->saveCategs();
            
            if ($numversion[0] >= 3.6) 
            {                
                $book->saveAuthors();
            }
            $tmp[] = "OK";
            //save categs             
            $book->checkin();
            $retVal[$i] = $tmp;

            $fk_bookid = $book->id;

            if($numversion[0] < 3.6) //for old version - XENO: Ez nem fut le
            {
                $query = "INSERT INTO #__booklibrary_authors_connect (fk_bookid,fk_authorid) VALUES ('$fk_bookid','{$new_authrs[$i]->id}')";
                $database->setQuery($query);
                $database->execute();          
            }
            else {  //XENO: Ez a lényegi rész, a könyvet összekapcsoljuk a szerőnk ID-jával
                $query = "INSERT INTO #__booklibrary_authors_connect (fk_bookid,fk_authorid) VALUES ('$fk_bookid','{$my_author_id}')";
                $database->setQuery($query);
                $database->execute();
            }

            mosBooklibraryImportExport::importReviewXML($fk_bookid, $book_xml);
            mosBooklibraryImportExport::importRentsXML($fk_bookid, $book_xml);
            mosBooklibraryImportExport::importRentRequestsXML($fk_bookid, $book_xml);
            mosBooklibraryImportExport::importEfilesXML($fk_bookid, $book_xml);
            mosBooklibraryImportExport::importVideoXML($fk_bookid, $book_xml);
            mosBooklibraryImportExport::importAudioXML($fk_bookid, $book_xml);
            mosBooklibraryImportExport::importTrackXML($fk_bookid, $book_xml);
        }
        unset($tmp);
        unset($book);
        continue;
    }

    return $retVal;
}    
?>